迴圈

輸入數獨

判別 列 行 區塊 是否有重複出現

輸出no

沒有

輸出yes

 

#include <iostream>
#include <cstring>

using namespace std;

void setSudo();
bool check(int number, char type);

int sudo[9][9];
bool bcheck[9];

int main()
{
    int i;

     while(cin >> sudo[0][0])
     {
         setSudo();

         for(i = 0; i<9; i++)
             if(!check(i, 'r') || !check(i, 'c') || !check(i, 's'))
                break;

        i >= 9 ? cout << "yes\n" : cout << "no\n";
     }
     
     return 0;
}

 

 

void setSudo()
{
    for(int i = 1; i<9; i++)
        cin >> sudo[0][i];

    for(int i = 1; i<9; i++)
        for(int j = 0; j<9; j++)
            cin >> sudo[i][j];
}

bool check(int number, char type)
{
    int i, j;

    memset(bcheck, true, 9);

    switch(type)
    {
        //row
        case 'r':

            for( i = 0; i<9; i++)
                if(bcheck[sudo[number][i] - 1])
                    bcheck[sudo[number][i] - 1] = false;
                else
                    return false;

            return true;

        //col
        case 'c':

            for(i = 0; i<9; i++)
                if(bcheck[sudo[i][number] - 1])
                    bcheck[sudo[i][number] - 1] = false;
                else
                    return false;

            return true;

        //square
        case 's':

            if(number < 3)
            {
                i = 0;
                j = number*3;
            }
            else if(number < 6)
            {
                i = 3;
                j = (number - 3)*3;
            }
            else
            {
                i = 6;
                j = (number - 6)*3;
            }

            for(int I = i+3; i<I; i++)
                for(int J = j; J<j+3; J++)
                    if(bcheck[sudo[i][J]-1])
                        bcheck[sudo[i][J]-1] = false;
                    else
                        return false;

            return true;

        default:
            return false;
    }
}

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()