c++题目:数迷
c++题目:数迷
题目
【题目描述】
给出含有N×N个格子的正方形表格,要求每个格子都填上一个个位数(范围1~N),使得每行、每列以及同一斜线上的数字都不同。部分格子已经填好数字。求满足题意的方案数。
【输入格式】
第一行输入一个整数N (1<=N<=9)。
下来给出一个部分已经填好数字的正方形。总共N行,每行N个字符,‘*’表示空白格子,还没有填数字。
【输出格式】
输出符合要求的方案数。
【输入样例1】
5
54*21
3*154
*54*2
4*215
*1***
【输出样例1】
1
【样例1数据提示】
5 4 3 2 1
3 2 1 5 4
1 5 4 3 2
4 3 2 1 5
2 1 5 4 3
【输入样例2】
5
*4*2*
3****
**4*2
4****
*****
【输出样例2】
2
【样例2数据提示】
(1):
1 4 3 2 5
3 2 5 1 4
5 1 4 3 2
4 3 2 5 1
2 5 1 4 3
(2):
5 4 3 2 1
3 2 1 5 4
1 5 4 3 2
4 3 2 1 5
2 1 5 4 3
解法
一道搜索算法的题目
#include<bits/stdc++.h> using namespace std; char mp[10][10]; int r[100][3]; int n,cnt,num; bool is_ok(int x,int y,char k){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==x&&mp[i][j]==k)return false; if(j==y&&mp[i][j]==k)return false; if(i-j==x-y&&mp[i][j]==k)return false; if(i+j==x+y&&mp[i][j]==k)return false; } } return true; } void prt(){ cout<<"---------------"<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<mp[i][j]; } cout<<endl; } } void dfs(int k){ for(int i=1;i<=n;i++){ if(is_ok(r[k][1],r[k][2],i+'0')){ mp[r[k][1]][r[k][2]]=i+'0'; if(k==num){ cnt++; } else dfs(k+1); mp[r[k][1]][r[k][2]]=0; } } } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>mp[i][j]; if(mp[i][j]=='*'){ r[++num][1]=i; r[num][2]=j; } } } dfs(1); cout<<cnt; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?