数独DFS经典解法

经典解法一维
#include <iostream> 
using namespace std;
       
bool sign = false;   
int num[9][9];
      
void Output()
{  
    for (int i = 0; i < 9; i++){
        for (int j = 0; j < 8; j++)
            cout << num[i][j] << " ";
        cout << num[i][8];
        cout << endl;
    }
}
  
/* 判断key填入n格时是否满足条件,n代表第几个格子 */
bool Check(int n, int key)
{
    /* 判断n所在横列是否合法 */
    for (int i = 0; i < 9; i++){
        /* j为n竖坐标 */
        int j = n / 9;
        if (num[j][i] == key)
            return false;
    }
     
    /* 判断n所在竖列是否合法 */
    for (int i = 0; i < 9; i++){
        /* j为n横坐标 */
        int j = n % 9;
        if (num[i][j] == key)
            return false;
    }
     
    int y = n / 9 / 3 * 3;
    int x = n % 9 / 3 * 3;    
    /* 判断n所在的小九宫格是否合法 */
    for (int i = y; i < y + 3; i++) 
        for (int j = x; j < x + 3; j++)
            if (num[i][j] == key)
                return false;
 
    return true;
}
  
/* 深搜 */
int DFS(int n)
{
    /* 所有的都符合,退出搜索,n代表格子数,共81个格子,0~80 */
    if (n > 80){
        sign = true;
        return 0;
    }
 
    if (num[n / 9][n % 9] != 0)
        DFS(n + 1); 
    else{
        /* 否则对当前位一次填入1~9进行测试 */
        for (int i = 1; i <= 9; i++){
            if (Check(n, i)){
                num[n / 9][n % 9] = i;
                /* 继续搜索,后续位也填1~9测试,直到最后一位,通过的话置true */
                DFS(n + 1);
                /* 返回时如果构造成功,则直接退出 */
                if (sign) 
                    return 0;
                /* 如果构造不成功,还原当前位 */
                num[n/9][n%9] = 0;
            }
                   
        }
    }
    return 0;
}
       
int main()
{ 
    for (int i = 0; i < 9; i++){
        for (int j = 0; j < 9; j++)
            cin >> num[i][j];
    }
    DFS(0);     //从第0格开始填
    Output();
}
=================================================================================================================================
我的解法二维
#include <iostream>
#include <string>
#include <cmath>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int dq[9][9] = { 0 };
bool check(int i,int j,int val) {
    for (int k = 0; k < 9;k++) {
        if (dq[k][j] == val)return 0;
    }
    for (int k = 0; k < 9; k++) {
        if (dq[i][k] == val)return 0;
    }
    for (int p = i/3*3; p < i / 3 * 3+3; p++) {
        for (int q = j / 3 * 3; q < j / 3 * 3+3; q++) {
            if(dq[p][q]==val)return 0;
        }
    }
    return 1;
}
int flag = 0;
int fun(int i, int j) {
    if (i > 8 || j > 8) {
        flag = 1;
        return 0;
    }
    if (dq[i][j] != 0) {
        if (i < 8)fun(i + 1, j);
        else fun(0, j + 1);
    }
    else {
        for (int k = 1; k <= 9;k++) {
            if (check(i, j, k)) {
                dq[i][j] = k;
                if (i < 8)fun(i + 1, j);
                else fun(0, j + 1);
                if (flag == 1)return 0;
                dq[i][j] = 0;
            }
        }
    }
    return 0;
}
int main(void) {
    for (int i = 0; i < 9;i++) {
        for (int j = 0; j < 9;j++) {
            cin >> dq[i][j];
        }
    }
    fun(0, 0);
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            cout<< dq[i][j]<<' ';
        }
        cout << endl;
    }
    return 0;
}
posted @ 2021-11-18 20:24  Zupernova  阅读(84)  评论(0编辑  收藏  举报