1、生成数独终局
void swap(int i, int begin);/*交换seed数组中的两个数*/
{
int temp;
temp = seed[i];
seed[i] = seed[begin];
seed[begin] = temp;
}
void put();/*将生成的数独和求解出来的数独写回文件sudoku.txt*/
{
int i,j,k;
for(i = 0; i < 9; i++){
k = 0;
for(j = 0; j < 17; j++){
if(j % 2 == 0)
y[i][j] = x[i][k++] + '0';
else if(j % 2 == 1)
y[i][j] = ' ';
}
y[i][j] = '\n';
}
if(count == 0)
fp = fopen(".\\sudoku.txt", "w+");
else
fp = fopen(".\\sudoku.txt", "a");
for(j = 0; j < 9; j++)
fprintf(fp, y[j]);
fprintf(fp, "\n");
fclose(fp);
}
void sudoku();/*x数组第一行形成一个全排列数后,根据第一行生成一个数独终局并进行行变换生成更多数独终局*/
{
int i,j;
int vary[9] = {0,3,6,1,4,7,2,5,8};
for(i = 1; i < 9; i++)
{
for(j = 0; j < 9; j++)
{
x[i][ (j + vary[i]) % 9 ] = x[0][j];
}
}
for(i = 0; i < 6; i++)
{
switch(i)
{
case 0: swap_x(0,0);break;
case 1: swap_x(4,5);break;
case 2: swap_x(3,4);break;
case 3: swap_x(3,4);swap_x(4,5);break;
case 4: swap_x(3,5);swap_x(4,5);break;
case 5: swap_x(3,5);break;
}
for(j = 0; j < 6; j++)
{
switch(j)
{
case 0: swap_x(0,0);break;
case 1: swap_x(7,8);break;
case 2: swap_x(6,7);break;
case 3: swap_x(6,7);swap_x(7,8);break;
case 4: swap_x(6,8);swap_x(7,8);break;
case 5: swap_x(6,8);break;
}
if(count < sum)
{
put();
count++;
}
else break;
switch(j)
{
case 0: swap_x(0,0);break;
case 1: swap_x(7,8);break;
case 2: swap_x(6,7);break;
case 3: swap_x(7,8);swap_x(6,7);break;
case 4: swap_x(7,8);swap_x(6,8);break;
case 5: swap_x(6,8);break;
}
}
switch(i)
{
case 0: swap_x(0,0);break;
case 1: swap_x(4,5);break;
case 2: swap_x(3,4);break;
case 3: swap_x(4,5);swap_x(3,4);break;
case 4: swap_x(4,5);swap_x(3,5);break;
case 5: swap_x(3,5);break;
}
if(count >= sum)
break;
}
}
2、解数独
void input();/*命令行输入-s时从指定文件中读取待求解数独,嵌套put(),dfs()函数*/
{
int i,j,k;
char ch;
count = 0;
while(!feof(fps)){
for(i = 0; i < 9; i++)
fgets(y[i], 30, (FILE*)fps);
ch = fgetc(fps);
for(i = 0; i < 9; i++)
y[i][17] = 0;
for(i = 0; i < 9; i++)
{
k = 0;
for(j = 0; j < 17; j++)
{
if(y[i][j] != ' ')
x[i][k++] = y[i][j] - '0';
}
}
dfs(0, 0);
count ++;
}
fclose(fps);
}
void dfs(int row, int col);/*回溯求解数独*/
{
int i,j,k;
int count = 0;
int d[50];
for(i = 0; i < 9; i++)
d[i] = 0;
if (row == 9 && col == 9)
{
put();
return;
}
if(x[row][col] == 0)
{
for (i = 0; i < 9; i++)
if (x[row][i] != 0)
d[x[row][i] - 1] = 1;
for(i = 0; i < 9; i++)
if(x[i][col] != 0)
d[ x[i][col] - 1 ] = 1;
for (i = int(row / 3) * 3; i < int(row / 3) * 3 + 3; i++)
{
for (j = int(col / 3) * 3; j < int(col / 3) * 3 + 3; j++)
{
if (x[i][j] != 0)
d[x[i][j] - 1] = 1;
}
}
for (i = 0; i < 9; i++)
if (d[i] == 0)
count++;
if (count == 0)
return;
else{
for (i = 0; i < 9; i++)
{
if (d[i] == 0){
x[row][col] = i + 1;
d[i] = 1;
if (col == 8)
{
if(row == 8)
{
col++;
row++;
}
if(row < 8){
col = 0;
row++;
}
}
else if(col < 8 && row <= 8)
col++;
dfs(row, col);
if (col == 0){
col = 8;
row--;
}
else
col--;
x[row][col] = 0;
d[i] = 0;
}
}
}
}
else{
if (col == 8){
if(row == 8){
col++;
row++;
}
if(row < 8){
col = 0;
row++;
}
}
else if(col < 8 && row <= 8)
col++;
dfs(row, col);
}
}