插播一条 关于数独的解法记录
Posted yinghualuowu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插播一条 关于数独的解法记录相关的知识,希望对你有一定的参考价值。
首先应该知道了。https://ac.nowcoder.com/acm/contest/625/E
这个数字必须是行,列,3X3小方块区域内,有且出现过一次的数字。
代码标记为
row[i][x] = 1 表示行出现过 col[j][x] = 1 表示列出现过
对于3X3的区域来说。有两种记录方式
tab[i/3][j/3][t]=1 最好理解,表示9个方块中某一个出现x,就标记为1 对应的。把 i/3和j/3给挪出来,同样可以对应一个方块 i/3 * 3 + j/3
然后就是简单的把数字给记录在数组里面
for(int i=0;i<9;i++) for(int j=0;j<9;j++) cin>>arr[i][j]; int ans = arr[i][j]; if(ans) int miarea = arrnum(i,j); row[i][ans]=1; col[j][ans]=1; area[miarea][ans]=1; else num++; Ve.push_back(make_pair(i,j));
接下来,判断是否符合条件
int arrnum(int i,int j) return i/3*3+j/3; bool check(int i,int j,int k) int t = arrnum(i,j); if(row[i][k]||col[j][k]||area[t][k]) return 0; return 1;
然后dfs一下
bool dfs(int sum) if(sum == num) return true; for(int i = 1;i<=9;i++) int x = Ve[sum].first; int y = Ve[sum].second; int miarea = arrnum(x,y); //cout<<x<<" "<<y<<" "<<miarea<<" "<<check(x,y,i)<<endl; if(check(x,y,i)) row[x][i]=1; col[y][i]=1; area[miarea][i]=1; arr[x][y]=i; if(dfs(sum+1)) return true; row[x][i]=0; col[y][i]=0; area[miarea][i]=0; arr[x][y]=0; return false;
最后是完整的代码
#include<bits/stdc++.h> using namespace std; vector<pair<int,int>>Ve; int arr[10][10],num; bool row[10][10],col[10][10],area[10][10],flag; int arrnum(int i,int j) return i/3*3+j/3; bool check(int i,int j,int k) int t = arrnum(i,j); if(row[i][k]||col[j][k]||area[t][k]) return 0; return 1; bool dfs(int sum) if(sum == num) return true; for(int i = 1;i<=9;i++) int x = Ve[sum].first; int y = Ve[sum].second; int miarea = arrnum(x,y); //cout<<x<<" "<<y<<" "<<miarea<<" "<<check(x,y,i)<<endl; if(check(x,y,i)) row[x][i]=1; col[y][i]=1; area[miarea][i]=1; arr[x][y]=i; if(dfs(sum+1)) return true; row[x][i]=0; col[y][i]=0; area[miarea][i]=0; arr[x][y]=0; return false; int main() int n; memset(col,0,sizeof(col)); memset(row,0,sizeof(row)); memset(area,0,sizeof(area)); num = 0; for(int i=0;i<9;i++) for(int j=0;j<9;j++) cin>>arr[i][j]; int ans = arr[i][j]; if(ans) int miarea = arrnum(i,j); row[i][ans]=1; col[j][ans]=1; area[miarea][ans]=1; else num++; Ve.push_back(make_pair(i,j)); dfs(0); for(int i=0;i<9;i++) for(int j=0;j<9;j++) if(j!=8) cout<<arr[i][j]<<" "; else cout<<arr[i][j]<<endl; return 0;
以上是关于插播一条 关于数独的解法记录的主要内容,如果未能解决你的问题,请参考以下文章
2021-09-23:编写一个程序,通过填充空格来解决数独问题。数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的(