九宮格數獨

     叔叔提了個數獨的問題,據說是最難九宮格,並提議我和弟弟考慮編程實現,貼一下我的代碼

     

#include <iostream>
#include <bits/stdc++.h>
#define N 9
using namespace std;

vector<vector<bool> >vis(N,vector<bool>(N));

void print(vector<vector<int> >grid)
{
    cout<<endl;
    for(int i = 0;i<N;i++)
    {
        for(int j = 0;j<N;j++)
        {
            cout<<grid[i][j]<<" ";

        }
        cout<<endl;
    }
}

bool judge(int t_i,int t_j,vector<vector<int> >grid)
{
    for(int i = 0;i<N;i++)
    {
        if(i!=t_i && grid[t_i][t_j] == grid[i][t_j]) return false;
    }

    for(int j = 0;j<N;j++)
    {
        if(j!=t_j && grid[t_i][t_j] == grid[t_i][j]) return false;
    }

    int block_i = (t_i/3)*3;
    int block_j = (t_j/3)*3;

    for(int i = 0;i<3;i++)
    {
        for(int j = 0;j<3;j++)
        {
            if(!(block_i+i == t_i && block_j+j == t_j) && grid[block_i+i][block_j+j] == grid[t_i][t_j]) return false;
        }
    }

    return true;
}

void dfs(int n,vector<vector<int> >grid)
{
    if(n == N*N)
    {
        cout<<endl;
        cout<<"The answer is :"<<endl;
        for(int i = 0;i<N;i++)
        {
            for(int j = 0;j<N;j++)
            {
                cout<<grid[i][j]<<" ";
            }
            cout<<endl;
        }
        return;
    }
    else
    {
        int t_i = n/N;
        int t_j = n%N;
        if(vis[t_i][t_j]) dfs(n+1,grid);
        else
        {
            for(int i = 1;i<=N;i++)
            {
                grid[t_i][t_j] = i;

                if(judge(t_i,t_j,grid))
                {
                    //print(grid);
                    dfs(n+1,grid);
                }
            }
        }
    }
}


int main()
{
    vector<vector<int> >grid(N,vector<int>(N));

    for(int i = 0;i<N;i++)
    {
        for(int j = 0;j<N;j++)
        {
            cin>>grid[i][j];
            vis[i][j] = !(!grid[i][j]);
        }
    }

    dfs(0,grid);
    return 0;
}


/**
8 0 0 0 0 0 0 0 0
0 0 3 6 0 0 0 0 0
0 7 0 0 9 0 2 0 0
0 5 0 0 0 7 0 0 0
0 0 0 0 4 5 7 0 0
0 0 0 1 0 0 0 3 0
0 0 1 0 0 0 0 6 8
0 0 8 5 0 0 0 1 0
0 9 0 0 0 0 4 0 0
**/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章