http://acm.sjtu.edu.cn/OnlineJudge/problem/1005
数独游戏,具体规则如下:
每一行都用到1,2,3,4,5,6,7,8,9, 位置不限,
每一列都用到1,2,3,4,5,6,7,8,9, 位置不限,
每3*3的格子(共9个这样的格子)都用到1,2,3,4,5,6,7,8,9, 位置不限,
游戏过程就是用1,2,3,4,5,6,7,8,9填充空白,并满足每行,每列,每个九宫格都用到1,2,3,4,5,6,7,8,9,
如下是个正确的sudoku:
输入n个数独,你来验证它是否违反规则。
第一行为数独个数,第二行开始为第一个数独,之后第二个,至第n个。
注意:每个数独间有个回车隔开。
若正确则输出"Right",否则输出"Wrong", 输出一个换一行。
1<=n<=20(输入的数独个数)
不论输入的数独是否正确,数据保证每个数都在1-9间。
2
5 8 1 4 9 3 7 6 2
9 6 3 7 1 2 5 8 4
2 7 4 8 6 5 9 3 1
1 2 9 5 4 6 3 7 8
4 3 6 1 8 7 2 9 5
7 5 8 3 2 9 1 4 6
8 9 2 6 7 1 4 5 3
6 1 5 9 3 4 8 2 7
3 4 7 2 5 8 6 1 9
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8
Right
Wrong
***********************************************************************************************************************************
这道题比较简单,定义一个动态三维数组,输入数据后,再做行检查、列检查、和块检查,如果都正确刚说明该独是正确的。编程的时候,细心一些,问题应该不大。
代码如下:
#include
#include
using namespace std;
int main()
{
int n;
cin>>n;
int ***p = new int **[n]; //三维数组
int b[10] = {0}; //用10是为了方面后面的用b的下标来计数
string *decision = new string[n];
for(int i = 0; i < n; i++) //初始化,在后面的操作中有错误的会被置为“Wrong”
decision[i] = "Right";
for(int i = 0; i < n ; i ++) //申请内存空间
{
p[i] = new int *[9];
for(int j = 0; j < 9; j++)
{
p[i][j] = new int[9];
}
}
for(int i = 0; i < n ; i++) //输入兼行检查
{
for(int j = 0 ; j < 9 ; j++)
{
for(int l = 0; l < 10; l++)
b[l] = 0;
for(int k = 0; k < 9; k++) //行检查
{
cin>>p[i][j][k]; //输入
b[p[i][j][k]]++; // p[i][j][k]元素值对应b[]的下标。
if(b[p[i][j][k]] > 1) //说明值 p[i][j][k] 出现了两次以上。
{
decision[i] = "Wrong";
}
}
}
}
for(int i = 0; i < n ; i++) //列检查
{
if("Wrong" == decision[i])
continue;
for(int j = 0 ; j < 9 ; j++)
{
//******节省一点时间
if("Wrong" == decision[i])
break;;
//*********************
for(int l = 0; l < 10; l++)
b[l] = 0;
for(int k = 0; k < 9; k++)
{
b[p[i][k][j]]++;
if(b[p[i][k][j]]>1)
{
decision[i] = "Wrong";
break;
}
}
}
}
for(int i = 0; i < n ; i++) //分块检查每块大小为3*3
{
if("Wrong" == decision[i])
continue;
for(int j = 0 ; j < 3 ; j++)
{
for(int k = 0; k < 3; k++)
{
//******节省一点时间
if("Wrong" == decision[i])
break;
//*********************
for(int l = 0; l < 10; l++)
b[l] = 0;
for(int x = 0; x < 3; x++)
for(int y = 0; y < 3; y++)
{
b[p[i][3*j+x][3*k+y]]++;
if(b[p[i][3*j+x][3*k+y]]>1)
{
decision[i] = "Wrong";
break;
}
}
}
}
}
for(int i = 0; i < n ; i++) //输出结果
{
cout<