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;
}

posted on 2017-03-27 21:35  h_z_cong  阅读(136)  评论(0编辑  收藏  举报

导航