1054.数独 SDNUOJ 1054
Description
syc最近迷上了数独这个游戏,他在完成一个数独后总要费一些时间来检查。于是他把lg作为苦力拽来帮他检查。由于lg是搞基的,所以他就想写个程序来判断syc完成的数独是否正确。不过最近他在感情上遇到了一些问题没有功夫去写,就想请你帮他完成这个任务。
数独规则:拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。
Input
一个9*9个矩阵
每个为1到9的数字
Output
一个数字,1为构成数独,0为不构成数独
Sample Input
3 8 7 9 6 2 5 1 4
5 1 9 4 3 8 7 6 2
6 2 4 1 5 7 3 9 8
8 7 6 3 1 9 2 4 5
2 9 1 5 8 4 6 7 3
4 3 5 2 7 6 1 8 9
7 5 8 6 4 3 9 2 1
9 4 3 7 2 1 8 5 6
1 6 2 8 9 5 4 3 7
Sample Output
1
把题解写成这样我也很无奈,我实在不会了,有简单的代码麻烦您告诉我一下,我出两块钱。以此博客为证。
#include <cstdio>
#include <iostream>
using namespace std;
int a[15][15];
int b[100];
bool check(int a, int b, int c, int d, int e, int f, int g, int h, int m)
{
if(a == 0 || b == 0 || c == 0 || d == 0 || e == 0 || f == 0 || g == 0 || h == 0 || m == 0)
return 0;
if(a == b || a == c || a == d || a == e || a == f || a == g || a == h || a == m )
return 0;
if(b == c || b == d || b == e || b == f || b == g || b == h || b == m )
return 0;
if(c == d || c == e || c == f || c == g || c == h || c == m )
return 0;
if(d == e || d == f || d == g || d == h || d == m )
return 0;
if(e == f || e == g || e == h || e == m )
return 0;
if(f == g || f == h || f == m )
return 0;
if(g == h || g == m || h == m )
return 0;
switch(a / 10)
{
case 0:
return 1;
default :
return 0;
}
}
int main()
{
int tot = 1;
for(int i = 1; i <= 9; ++i)
for(int j = 1; j <= 9; ++j)
{
scanf("%d", &a[i][j]);
b[tot++] = a[i][j];
}
bool flag;
for(int i = 1; i <= 9; ++i)
{
flag = check(a[i][1], a[i][2], a[i][3], a[i][4], a[i][5], a[i][6], a[i][7], a[i][8], a[i][9]);
if(!flag)
{
cout << '0' << '\n';
return 0;
}
}
for(int j = 1; j <= 9; ++j)
{
flag = check(a[1][j], a[2][j], a[3][j], a[4][j], a[5][j], a[6][j], a[7][j], a[8][j], a[9][j]);
if(!flag)
{
cout << '0' << '\n';
return 0;
}
}
int t = 9;
while(t--)
{
int c = 1;
flag = check(b[c], b[c + 1], b[c + 2], b[c + 9], b[c + 10], b[c + 11], b[c + 18], b[c + 19], b[c + 20]);
if(!flag)
{
cout << '0' << '\n';
return 0;
}
c += 3;
}
cout << '1' << '\n';
return 0;
}