#include<stdio.h>
#define N 100
FILE *fp;
int a[9][9],finish=0,o=0,biao[3][9][9],qu[9][9];
void print()
{
int i,j;
//fp=fopen(".\\output.txt","w");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
fprintf(fp,"%d ",a[j]);
if((j+1)%3==0) fprintf(fp," ");
}
fprintf(fp,"\n");
if((i+1)%3==0) fprintf(fp,"\n");
}
fprintf(fp,"\n\n");
// fclose(fp);
}
void run(int x)
{
//if(o==0)
{
int i=0,j=0,y;
for(;x<9;x++)
{
for(y=0;y<9;y++)
{
if(a[x][y]==0)
{
for(i=1;i<=9;i++)
{
if(biao[0][x][i-1]==1||biao[1][y][i-1]==1||biao[2][qu[x][y]][i-1]==1)
continue;
a[x][y]=i;
biao[0][x][i-1]=1;
biao[1][y][i-1]=1;
biao[2][qu[x][y]][i-1]=1;
finish++;
if(finish==81)
{
o++;/*
fp=fopen(".\\output.txt","w");
fprintf(fp,"%d",o);
fclose(fp);
//*/
print();
}
else run(x);
if(o==N) break;
a[x][y]=0;
biao[0][x][i-1]=0;
biao[1][y][i-1]=0;
biao[2][qu[x][y]][i-1]=0;
finish--;
}
break;
}
}
if(o==N||i>9) break;
}
}
}
int main()
{
int i,j,x,y;
for(i=0;i<3;i++)
{
for(x=0;x<3;x++)
{
for(j=0;j<3;j++)
{
for(y=0;y<3;y++) qu[3*i+x][3*j+y]=3*i+j;
}
}
}
for(i=0;i<9;i++) {for(j=0;j<9;j++) {a[j]=0; biao[0][j]=0;biao[1][j]=0;biao[2][j]=0;}}
if(fp=fopen(".\\input.txt","r"))
{
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%d%d%d",&x,&y,&j);
a[x-1][y-1]=j;
biao[0][x-1][j-1]=1;
biao[1][y-1][j-1]=1;
biao[2][qu[x-1][y-1]][j-1]=1;
}
finish=i;
fclose(fp);
}
/* fp=fopen(".\\output.txt","w");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(a[j]!=0) fprintf(fp,"%d ",a[j]);
else fprintf(fp,"X ");
if((j+1)%3==0) fprintf(fp," ");
}
fprintf(fp,"\n");
if((i+1)%3==0) fprintf(fp,"\n");
}
fclose(fp);
*/
fp=fopen(".\\output.txt","w");
run(0);
/*for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
fprintf(fp,"%d ",a[j]);
if((j+1)%3==0) fprintf(fp," ");
}
fprintf(fp,"\n");
if((i+1)%3==0) fprintf(fp,"\n");
}*/
fclose(fp);
return 0;
}
输入格式:
每行三个数,表示M行N列的数字为I