插播一条 关于数独的解法记录
首先应该知道了。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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2017-08-31 2017ACM/ICPC广西邀请赛 Duizi and Shunzi
2017-08-31 2017ACM/ICPC广西邀请赛 CS Course
2017-08-31 2017ACM/ICPC广西邀请赛 A Math Problem