C/C++の宿題を片付けます 62代目
■ このスレッドは過去ログ倉庫に格納されています
0420デフォルトの名無しさん
2006/03/10(金) 00:39:58一応Lv1を再帰でゴリゴリやった。
1レスに収めるためにコードを圧縮したので適当に解凍よろしく。
#include<stdio.h>
typedef struct T{int map[9*9],x[9],y[9],xy[9];}T[1];
int push(T t,int yx,int n){
int y = yx/9,x=yx%9;
if( t->map[yx] || ((t->y[y]|t->x[x]|t->xy[x/3+y/3*3]) & 1<<n) )return 0;
t->y[y]|=1<<n;t->x[x]|=1<<n;t->xy[x/3+y/3*3]|=1<<n;t->map[yx]=n;
return 1;
}
void pop(T t,int yx){
int y = yx/9,x=yx%9,n=t->map[yx];t->y[y]&=~(1<<n);t->x[x]&=~(1<<n);t->xy[x/3+y/3*3]&=~(1<<n);t->map[yx] = 0;
}
int calc(T t,int yx){
int i;if(yx==9*9)return 1;else if(t->map[yx])return calc(t,yx+1);
for(i=1;i<=9;++i)if(push(t,yx,i)){if(calc(t,yx+1))return 1;else pop(t,yx);}return 0;
}
int main(){
T x={{{0}}};int i,j,d;for(i=0;i<9*9;++i)scanf("%1d",&d),push(x,i,d);
if(calc(x,0))for(i=0;i<9;++i,printf("\n"))for(j=0;j<9;++j)printf("%d",x->map[i*9+j]);
else printf("解がない\n");return 0;
}
■ このスレッドは過去ログ倉庫に格納されています