想必大家都玩过数独吧(我竟没玩过.....),在最近的周赛中我就遇到了一个关于数独的问题,给出数独让你判断是否正确,当时a了,可后来经过查询发现当时是由于数据不全面的原因才侥幸通过,下面我就纠正一下我的错误,聪明的你可不要犯和我一样错误吆。
错误!!!的思想:
1,,每列中包含1~9
2,每行中包含1~9
后来才知道原来只满足这两个条件并不能满足每一个九宫格中包含1~9
正解!!!:
1,,每列中包含1~9
2,每行中包含1~9
3.每个九宫格中包含1~9代码:
.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
int G[10][10];
bool Line[10][10]; //Line[i][j]:判断第i行数字j有没有出现过
bool Column[10][10]; //Column[i][j]:判断第i列数字j有没有出现过
bool Block[10][10]; //Block[i][j]:判断第i块数字j有没有出现过
int t;
bool judge()
{
memset(Line,false,sizeof(Line));
memset(Column,false,sizeof(Column));
memset(Block,false,sizeof(Block));
for(int i =1;i<=9;i++)
{
for(int j = 1; j<=9;j++)
{
int Blocknum = (i-1)-((i-1) % 3) + ((j-1) / 3 + 1);
Line[i][G[i][j]] = 1;
Column[j][G[i][j]] = 1;
Block[Blocknum][G[i][j]] = 1;
}
}
int flag = 1;
for(int i =1;i<=9;i++)
{
for(int j = 1; j<=9;j++)
{
if( !Line[i][j] ) return 0;
if( !Column[i][j]) return 0;
if( !Block[i][j]) return 0;
}
}
return flag;
}
int main()
{
cin>>t;
while(t--)
{
memset(G,0,sizeof(G));
for(int i = 1; i <= 9; i++)
{
for(int j = 1; j<=9;j++)
{
scanf("%d",&G[i][j]);
}
}
bool flag = judge();
if (flag) cout<<"Right"<<endl;
else cout<<"Wrong"<<endl;
}
return 0;
}
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
int G[10][10];
bool Line[10][10]; //Line[i][j]:判断第i行数字j有没有出现过
bool Column[10][10]; //Column[i][j]:判断第i列数字j有没有出现过
bool Block[10][10]; //Block[i][j]:判断第i块数字j有没有出现过
int t;
bool judge()
{
memset(Line,false,sizeof(Line));
memset(Column,false,sizeof(Column));
memset(Block,false,sizeof(Block));
for(int i =1;i<=9;i++)
{
for(int j = 1; j<=9;j++)
{
int Blocknum = (i-1)-((i-1) % 3) + ((j-1) / 3 + 1);
Line[i][G[i][j]] = 1;
Column[j][G[i][j]] = 1;
Block[Blocknum][G[i][j]] = 1;
}
}
int flag = 1;
for(int i =1;i<=9;i++)
{
for(int j = 1; j<=9;j++)
{
if( !Line[i][j] ) return 0;
if( !Column[i][j]) return 0;
if( !Block[i][j]) return 0;
}
}
return flag;
}
int main()
{
cin>>t;
while(t--)
{
memset(G,0,sizeof(G));
for(int i = 1; i <= 9; i++)
{
for(int j = 1; j<=9;j++)
{
scanf("%d",&G[i][j]);
}
}
bool flag = judge();
if (flag) cout<<"Right"<<endl;
else cout<<"Wrong"<<endl;
}
return 0;
}
和我一样,可能在第一次看到这个代码的时候
int Blocknum = (i-1)-((i-1) % 3) + ((j-1) / 3 + 1); 对这句话不太了解,这句的意思是计算这个数属于第几个九宫格,
Block[Blocknum][G[i][j]] = 1;
这句的意思则是第几个九宫格的第几个数十存在的