Gym - 100676D Sudoku 基础题
题目链接: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; }