描述
问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。
例如:
输入
输出
数据范围: 输入一个 9*9 的矩阵
输入描述:
包含已知数字的9X9盘面数组[空缺位以数字0表示]
输出描述:
完整的9X9盘面数组
示例
输入:
0 9 2 4 8 1 7 6 3
4 1 3 7 6 2 9 8 5
8 6 7 3 5 9 4 1 2
6 2 4 1 9 5 3 7 8
7 5 9 8 4 3 1 2 6
1 3 8 6 2 7 5 9 4
2 7 1 5 3 8 6 4 9
3 8 6 9 1 4 2 5 7
0 4 5 2 7 6 8 3 1
输出:
5 9 2 4 8 1 7 6 3
4 1 3 7 6 2 9 8 5
8 6 7 3 5 9 4 1 2
6 2 4 1 9 5 3 7 8
7 5 9 8 4 3 1 2 6
1 3 8 6 2 7 5 9 4
2 7 1 5 3 8 6 4 9
3 8 6 9 1 4 2 5 7
9 4 5 2 7 6 8 3 1
思路分析: 构建一个结构体变量,保存空缺处的坐标;从键盘接受数据的时候先对数据进行判断,如果为0(即空),则将其坐标存进结构体变量中。从第一个空缺处开始填数字1-9,判断其所在行、列、宫内数字是否重复;若不重复,则填入数字。若1-9都重复,则返回上一空缺处,并使其值增1并判断是否有重复。
程序如下:
#include<stdio.h>
typedef struct
{
int x;
int y;
}sudo;
int func(int arr[9][9],int x,int y,int number)
{
for(int i=0;i<9;i++)
{
if(arr[x][i] == number)
return 0;
}
for(int i=0;i<9;i++)
{
if(arr[i][y] == number)
return 0;
}
for(int i=x/3*3;i<x/3*3+3;i++)
{
for(int j=y/3*3;j<y/3*3+3;j++)
{
if(arr[i][j] == number)
return 0;
}
}
return 1;
}
int main()
{
int n=9,arr[9][9];
sudo str[81];
int index = -1;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
scanf("%d ",&arr[i][j]);
if(arr[i][j] == 0)
{
str[++index].x = i;
str[index].y = j;
}
}
}
for(int i=0;i<=index;i++)
{
for(int j=9;j>=1;j--)
{
if(j==9)
{
j = arr[str[i].x][str[i].y]-1;
if(j<0)j=9;
arr[str[i].x][str[i].y] = 0;
}
if(func(arr,str[i].x,str[i].y,j))
{
arr[str[i].x][str[i].y] = j;
break;
}
}
if(arr[str[i].x][str[i].y] ==0)//回溯
{
i-=2;
}
}
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
注: 可能例程的原因,填的数字从1开始会运行超时(-_-||)。