皇后问题

mac2024-07-30  53

这个题要注意的,首先是数组的定义问题,看定义的结果是否与自己想象的一致 其次就是注意判断与剪枝的顺序,应该先判断符合条件,然后再判断位数是否达到

#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int max = 50; int mark[50]={0};//我定义为int型,当定义为布尔类型时会不知道什么值会全是0 int huanghou[50]; int n; int ans=0; void dfs(int index) { printf("%d",n); if(index>n) { for(int i=1;i<=n;i++) { printf("%d",huanghou[i]); } ans++; return; } if(index>3){ for(int i=1;i<=index-1;i++) { for(int j=i+1;j<=index-1;j++) { printf("i,j,i-j= %d,%d,%d",i,j,i-j); printf("%d,%d,%d",huanghou[i],huanghou[j],huanghou[i-j]); if(abs(i-j)==abs(huanghou[i]-huanghou[j])) return; } } } for(int x=1;x<=n;x++) { printf("x=%d\n",x); printf("index=%d",index); printf("huanghou[index]=%d\n",huanghou[index]); if(!mark[x]) { printf("进入成功"); printf("index=%d",index); printf("huanghou[index]=%d",huanghou[index]); huanghou[index]=x; mark[x]=true; dfs(index+1); mark[x]=false; } } } int main() { for(int i=0;i<50;i++) { if(mark[i]=false) { printf("false"); } } n = 8; dfs(1); return 0; }

以上是错误代码

#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int max = 50; int mark[50]={0}; int huanghou[50]; int n; int ans=0; void dfs(int index) { if(index>3){ for(int i=1;i<=index-2;i++) { for(int j=i+1;j<=index-1;j++) { if(abs(i-j)==abs(huanghou[i]-huanghou[j])) return; } } } if(index>n) { for(int i=1;i<=n;i++) { printf("%d",huanghou[i]); } printf("\n"); ans++; return; } for(int x=1;x<=n;x++) { if(!mark[x]) { huanghou[index]=x; mark[x]=1; dfs(index+1); mark[x]=0; } } } int main() { n = 8; dfs(1); printf("%d",ans); return 0; }
最新回复(0)