本文主要是介绍计算机秒玩数独,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在线数独
#include <bits/stdc++.h>
using namespace std;
bool row[10][10], column[10][10], grid[10][10];
int a[10][10];
void dfs(int x, int y)
{if(a[x][y]){if(x==9 && y==9){for(int i=1; i<=9; ++i){cout<<"| ";for(int j=1; j<=9; ++j){cout << a[i][j] << " | ";}cout << endl;for(int j=1; j<=37; ++j){printf("-");} cout<<endl;}exit(0);}else if(y==9){ //第9列有数字,x行已经搜完 dfs(x+1, 1); //开始看下一行第一列 }else{dfs(x, y+1); //搜下一列 }}else{for(int i=1; i<=9; ++i){int grid_num=(x-1)/3*3+ceil(y/3.0); //如果第x行y列以及这一位置所在的网格里均没有出现过i这个数字 if(row[x][i]==false && column[y][i]==false && grid[grid_num][i]==false){//给第x行y列填充为i,继续进行搜索a[x][y]=i; row[x][i]=true;column[y][i]=true;grid[grid_num][i]=true;//如果已经到了结束状态,直接输出 if(x==9 && y==9){for(int j=1; j<=9; ++j){cout<<"| ";for(int k=1; k<=9; ++k){cout << a[j][k] << " | ";}cout << endl;for(int j=1; j<=37; ++j){printf("-");} cout << endl;}exit(0);}else if(y==9){ //第9列有数字,x行已经搜完 dfs(x+1, 1); //回溯,去标记 a[x][y]=0;row[x][i]=false;column[y][i]=false;grid[grid_num][i]=false;}else{ //搜下一列 dfs(x, y+1); //回溯,去标记a[x][y]=0;row[x][i]=false;column[y][i]=false;grid[grid_num][i]=false;}}}}
}
int main()
{memset(row, 0, sizeof(row));memset(column, 0, sizeof(column));memset(grid, 0, sizeof(grid));for(int i=1; i<=9; ++i){for(int j=1; j<=9; ++j){cin >> a[i][j];if(a[i][j]){int num=a[i][j];//计算网格编号 int grid_num=(i-1)/3*3+ceil(j/3.0);//第i行有了num,这一行不能再用num row[i][num]=true;//第j列有了num,这一列不能再用numcolumn[j][num]=true; //第grid_num个网格有了num,这一网格不能再用num grid[grid_num][num]=true;}}}for(int i=1; i<=37; ++i){printf("-");} printf("\n");//从第一行第一列开始搜索填数字 dfs(1, 1); return 0;
}
这篇关于计算机秒玩数独的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!