数独游戏
序号:#54 难度:一般 时间限制:1000ms 内存限制:10M
描述
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称"九宫格"。 一个合法的数独棋盘满足上面的条件,即1-9每个数字在每一行、每一列和每一宫中都只出现一次,而并不要求一定有解。 请判断给出的数独棋盘是否合法。
举例: 有一个数独棋盘如下:
5 3 - - 7 - - - -
6 - - 1 9 5 - - -
- 9 8 - - - - 6 -
8 - - - 6 - - - 3
4 - - 8 - 3 - - 1
7 - - - 2 - - - 6
- 6 - - - - 2 8 -
- - - 4 1 9 - - 5
- - - - 8 - - 7 9
它是一个合法棋盘,输出true。
输入
从左到右从上到下,使用空格分隔每一宫,使用逗号分隔每一格,没有数字则代表该格为空。
输出
true或false表示该数独棋盘是否合法。
输入样例
5,3,-,6,-,-,-,9,8 -,7,-,1,9,5,-,-,- -,-,-,-,-,-,-,6,- 8,-,-,4,-,-,7,-,- -,6,-,8,-,3,-,2,- -,-,3,-,-,1,-,-,6 -,6,-,-,-,-,-,-,- -,-,-,4,1,9,-,8,- 2,8,-,-,-,5,-,7,9
5,3,-,6,-,-,-,9,8 -,7,-,1,9,5,-,-,- -,-,-,-,-,-,-,6,- 8,-,-,4,-,-,7,-,- -,6,-,8,-,3,-,2,- -,-,3,-,-,1,-,-,6 -,6,-,-,-,-,-,9,- -,-,-,4,1,9,-,8,- 2,8,-,-,-,5,-,7,9
输出样例
true
false
#include
using namespace std;
int main()
{
char a[9][9];
int b[9][9],d[9][9],c[10]={0},i=0,m=0,s[10]={0},j,z,k;
char t;
while(cin>>a[i][0]>>t>>a[i][1]>>t>>a[i][2]>>t>>a[i][3]>>t>>a[i][4]>>t>>a[i][5]>>t>>a[i][6]>>t>>a[i][7]>>t>>a[i][8])
{
for(j=0;j<9;j++)
{
if(a[i][j]>='1'&&a[i][j]<='9')
{
b[i][j]=a[i][j]-'0';
}
else
{
b[i][j]=0;
}
}
i++;
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
d[j/3+3*(i/3)][j%3+(i%3)*3]=b[i][j];
}
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
c[d[i][j]]++;
}
for(j=1;j<=9;j++)
{
if(c[j]>=2)
{
m=1;
break;
}
}
if(m==1)
break;
for(j=1;j<=9;j++)
{
c[j]=0;
}
}
if(m==0)
{
for(i=0;i<9;i++)
{
for(j=0;j<=9;j++)
{
c[j]=0;
}
for(j=0;j<9;j++)
{
c[d[j][i]]++;
}
for(j=1;j<=9;j++)
{
if(c[j]>=2)
{
m=1;
break;
}
}
if(m==1)
break;
}
if(m==0)
{
for(i=0;i<7;i+=3)
{
for(j=0;j<7;j+=3)
{
for(z=0;z<=9;z++)
{
s[z]=0;
}
for(z=i;z<=i+2;z++)
{
for(k=j;k<=j+2;k++)
{
s[d[z][k]]++;
}
}
for(z=1;z<=9;z++)
{
if(s[z]>=2)
{
m=1;
break;
}
}
if(m==1)
break;
}
if(m==1)
break;
}
if(m==0)
{
cout<<"true"<