#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int f(int i,int j,int s);
int n[9][9];
int line[9][9],column[9][9],block[9][9];
char youxi[9][9];
int m[9][9];
int l[9][9],c[9][9],v[9][9];
void main()
{
int x=81,a,b;char w;
while(1)
{
printf("<<<<<欢迎进入数独游戏>>>>>\n");
printf("< >\n");
printf("< 进入游戏请按a >\n");
printf("< 退出游戏请按e >\n");
printf("< 了解规则请按h >\n");
printf("< >\n");
printf("<<<<<<<<<<<<>>>>>>>>>>>>>>\n");
char temp;
scanf("%c",&w);
temp=w;
if(temp=='h') {
printf("** 数独游戏在9x9的方格内进行,分为3x3的小方格,被称为区. **\n");
printf("** 数独游戏首先从已经填入数字的格子开始. **\n");
printf("** 用1至9之间的数字填满空格,一个格子只能填入一个数字. **\n");
printf("** 每个数字在每一行只能出现一次; **\n");
printf("** 每个数字在每一列只能出现一次; **\n");
printf("** 每个数字在每一区只能出现一次; **\n");
printf("** 总结这些规则,即每个数字在每一行,每一列和每一区只能出现一次.**\n");}
if(temp=='a') break;
if(temp=='e') exit(1);
}
int i,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
n[i][j]=0;
line[i][j]=0;
column[i][j]=0;
m[i][j]=0;
l[i][j]=0;
c[i][j]=0;
v[i][j]=0;
block[i][j]=0;
}
srand((unsigned)time(NULL));
f(0,0,rand()%9+1);
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{ int y;
y=rand()%9;
if(y<=3)
{
m[i][j]=n[i][j];
}
}
}
while(1)
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
if(m[i][j]!=0) {youxi[i][j]=m[i][j]+48;
l[i][m[i][j]-1]=1;
c[j][m[i][j]-1]=1;
v[i/3*3+j/3][m[i][j]-1]=1;}
}
}
printf("┏━┯━┯━┳━┯━┯━┳━┯━┯━┓\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[0][0],youxi[0][1],youxi[0][2],youxi[0][3],youxi[0][4],youxi[0][5],youxi[0][6],youxi[0][7],youxi[0][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[1][0],youxi[1][1],youxi[1][2],youxi[1][3],youxi[1][4],youxi[1][5],youxi[1][6],youxi[1][7],youxi[1][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[2][0],youxi[2][1],youxi[2][2],youxi[2][3],youxi[2][4],youxi[2][5],youxi[2][6],youxi[2][7],youxi[2][8]);
printf("┣━┿━┿━╋━┿━┿━╋━┿━┿━┫\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[3][0],youxi[3][1],youxi[3][2],youxi[3][3],youxi[3][4],youxi[3][5],youxi[3][6],youxi[3][7],youxi[3][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[4][0],youxi[4][1],youxi[4][2],youxi[4][3],youxi[4][4],youxi[4][5],youxi[4][6],youxi[4][7],youxi[4][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[5][0],youxi[5][1],youxi[5][2],youxi[5][3],youxi[5][4],youxi[5][5],youxi[5][6],youxi[5][7],youxi[5][8]);
printf("┣━┿━┿━╋━┿━┿━╋━┿━┿━┫\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[6][0],youxi[6][1],youxi[6][2],youxi[6][3],youxi[6][4],youxi[6][5],youxi[6][6],youxi[6][7],youxi[6][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[7][0],youxi[7][1],youxi[7][2],youxi[7][3],youxi[7][4],youxi[7][5],youxi[7][6],youxi[7][7],youxi[7][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[8][0],youxi[8][1],youxi[8][2],youxi[8][3],youxi[8][4],youxi[8][5],youxi[8][6],youxi[8][7],youxi[8][8]);
printf("┗━┷━┷━┻━┷━┷━┻━┷━┷━┛\n");
loop: printf("请输入填写数字的坐标(1-9)\n");
scanf("%d%d",&a,&b);
if(a>9||b>9){printf("plaese intput 1-9\n");goto loop;}
if(m[a-1][b-1]!=0) printf("该空格内有数字\n%d\n",m[a-1][b-1]);
else
{
printf("请填入相应数字\n");
scanf("%d",&m[a-1][b-1]);
if(!l[a-1][m[a-1][b-1]-1]&&!c[b-1][m[a-1][b-1]-1]&&!v[(a-1)/3*3+(b-1)/3][m[a-1][b-1]-1] ) continue;
else
{
m[a-1][b-1]=0;
printf("填写错误\n");
printf("显示答案键入r\n");exit(0);
if(getchar()=='r')
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
m[i][j]=n[i][j];
}
}
}
}
}
}
int f(int i,int j,int s)
{
int k;
for (k = s - 1; k < 9; k++)
{
if (!line[i][k] && !column[j][k] && !block[i/3*3+j/3][k])
{
n[i][j] = k + 1;
line[i][k] = 1;
column[j][k] = 1;
block[i/3*3+j/3][k] = 1;
if (i == 8 && j == 8)
return 1;
if (j == 8)
{
j = 0;
i++;
}
else
j++;
f(i, j, 1);
return 1;
}
if (k == 8) //huisu
{
do
{
if (j == 0)
{
j = 8;
i--;
}
else
j--;
line[i][n[i][j]-1] = 0;
column[j][n[i][j]-1] = 0;
block[i/3*3+j/3][n[i][j]-1] = 0;
}
while (n[i][j] == 9);
f(i, j, n[i][j] + 1);
return 1;
}
}
return 1;
}