题目链接:https://odzkskevi.qnssl.com/1110bec98ca57b5ce6aec79b210d2849?v=1490453767
题解:
方法1:用STL的set,把每个数放到相应的集合。在放之前如果找到相同的数,则invalid。
方法2:由于数字只有1~9,可以开vis[]数组,记录每行,每列,每格是否已经放了某个数,如果放了,就标记为1。row[9][10] , col[9][10], grid[3][3][10];
方法3:分别计算每行,每列,每格的数字和,如果全为45,才符合。
注意格子的处理方法是使用二维数组grid[i/3][j/3] i,j范围0~8,因为这样比好好处理格子,而对行列又没有影响。
这里只放方法1代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<string>
#include<set>
#define LL long long
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
using namespace std;
set<char>row[10], col[10], grid[4][4];
char a[50][50];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
//FILE *fin;
//fin = fopen("1.txt","r");
int B = 1;
for(int i = 0; i<9; i++)
{
//fscanf(fin,"%s",a[i]+1);
scanf("%s",a[i]);
row[i].clear();
col[i].clear();
}
for(int i = 0; i<4; i++)
for(int j = 0; j<4; j++)
grid[i][j].clear();
for(int i = 0; i<9; i++)
for(int j = 0; j<9; j++)
{
if(row[i].count(a[i][j])==0 && col[j].count(a[i][j])==0 && grid[i/3][j/3].count(a[i][j])==0 )
{
row[i].insert(a[i][j]);
col[j].insert(a[i][j]);
grid[i/3][j/3].insert(a[i][j]);
}
else
{
B = 0;
break;
}
}
if(B)
puts("Valid");
else
puts("Invalid");
}
return 0;
}