数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
#include<bits/stdc++.h> using namespace std; bool isSudo = false; int num[9][9]; int tol = 0; void input() { for(int i = 0; i < 9; ++i){ for(int j = 0; j < 9; ++j){ scanf("%d",&num[i][j]); } } } void output(int a[][9]) { for(int i = 0; i < 9; ++i){ for(int j = 0; j < 9; ++j){ printf("%d ",num[i][j]); } printf("\n"); } printf("------------------------------\n"); } bool check(int n, int key) { int x = n/9; int y = n%9; for(int j = 0; j <9; ++j){//检查同行 if(num[x][j] == key) return false; } for(int i = 0; i < 9; ++i){//检查同列 if(num[i][y] == key) return false; } int subx = n/9/3*3;//所在宫的其实位置 int suby = n%9/3*3; for(int i = subx; i < subx+3; ++i){ for(int j = suby; j < suby+3; ++j){ if(num[i][j] == key) return false; } } return true; } void dfs(int n) { if(n > 80){ ++tol; output(num); return; } if(num[n/9][n%9] != 0){ //此位置已经放了数 直接跳过 dfs(n+1); } else{ for(int i = 1; i <= 9; ++i){ if(check(n,i)){ num[n/9][n%9] = i; dfs(n+1); num[n/9][n%9] = 0; } } } } int main() { input(); dfs(0); printf("\n"); printf("total : %d",tol); return 0; }