2 条题解
-
1
#include<iostream> #include<cstring> using namespace std; int a[10][10],n;//二维数组保存结果,n用来传递全局变量 bool b[10][10],c[10][10];//分别用于判断当前数是否在这一行这一列出现过 int print()//输出程序 { for(int i=1;i<=n;i++) { cout<<a[i][1]; for(int j=2;j<=n;j++) cout<<" "<<a[i][j]; cout<<endl; } exit(0); } void find(int s,int y,int x)//s:当前进行到第几个数;y:当前行;x:当前列 { if(s>n*n) print(); else for(int i=1;i<=n;i++) { if((!b[y][i])&&(!c[x][i])) { a[y][x]=i; b[y][i]=1; c[x][i]=1; if(s%n==0) find(s+1,y+1,1); else find(s+1,y,x+1); b[y][i]=0; c[x][i]=0; } } } int main() { memset(b,sizeof(b),0); memset(c,sizeof(c),0); cin>>n; find(1,1,1);//从第一个数第一行第一个开始填数 return 0; }
-
0
使用贪心策略,搜索方案 整体思路是搜索每一行的最小情况,从小到大搜索,则所输出的必定是最小情况 代码中一些变量含义 f:代表行列数 b[ ]:每行搜索时的已用数标记 c[ ][ ]:每列搜索已用数标记 d[ ]:每一行搜索结果 其余的都能在代码中轻易看出含义
using namespace std; bool b[100]; bool c[100][100]; int d[100]; int f; void print () { for (int i=0;i<f;i++) { printf ("%d ",d[i]); c[i][d[i]]=1; } printf ("\n"); } bool check (int i,int num) { bool p; if (b[i]==0&&c[num][i+1]==0) p=1; return p; } void search (int num) { for (int i=0;i<f;i++) if (check (i,num)==1) { d[num]=i+1; b[i]=1; if (num==f-1) { print (); break; } else search (num+1); b[i]=0; } } int main() { cin>>f; for (int i=0;i<f;i++) { search (0); for (int j=0;j<=f;j++) b[j]=0; } return 0; }
“关注bilibili虚拟主播不知源深喵,关注不知源深谢谢喵”
- 1
信息
- ID
- 449
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 67
- 已通过
- 22
- 上传者