华为OJ(数独游戏-Sudoku)
| 描述 |
问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个粗线宫内的数字均含1-9,并且不重复。 |
|---|---|
| 知识点 | 查找,搜索,排序 |
| 运行时间限制 | 10M |
| 内存限制 | 128 |
| 输入 |
包含已知数字的9X9盘面数组[空缺位以数字0表示] |
| 输出 |
完整的9X9盘面数组 |
Sample Input
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
Sample Output
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
#include <iostream>
using namespace std;
int num[9][9];
void input()
{
for(int i=0;i<9;i++)
for(int j=0;j<9; j++)
{
char t;
cin>>t;
num[i][j]=t-'0';
}
}
void output()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<8; j++)
{
cout<<num[i][j]<<" ";
}
cout<<num[i][8];
cout<<endl;
}
cout<<endl;
}
bool check(int i, int j, int t)
{
//row
for(int x=0; x<9; x++)
if(num[i][x]==t)
return false;
//column
for(int x=0; x<9; x++)
if(num[x][j]==t)
return false;
//square
int k,w;
k=i/3*3;
w=j/3*3;
for(int i=k;i<k+3; i++)
for(int j=w; j<w+3; j++)
if(num[i][j]==t)
return false;
return true;
}
int answer_count=0;
void dfs(int n)
{
if(n>80)
{
output();
answer_count++;
return;
}
int i,j;
i=n/9;
j=n%9;
//未放过
if(num[i][j]!=0)
{
dfs(n+1);
}
else
{
for(int t=1; t<=9; t++)
{
if(check(i, j, t))
{
num[i][j]=t;
dfs(n+1);
if(answer_count>0)
return;
num[i][j]=0;
}
}
}
}
int main()
{
input();
dfs(0);
cout<<"finished"<<endl;
return 0;
}

浙公网安备 33010602011771号