遇到的问题:one之前写了八皇后,对于n皇后的对角线问题一直有问题。但是仔细都列出来找了一下规律之后觉得其实蛮简单的。关键是对角线标记数组要开大一点,避免越界。 two都对了之后结果TLE,最后在帮助下打了个表,顺利通过啦。。
思路:行不需要标记,从0循环到n-1,一种方法的递归结束条件是行循环到了n-1,只要列标记和对角线标记。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> using namespace std; int n; int sum; int r[15],d1[35],d2[35],a[11]; //d1和d2数组分别是两个对角线数组,注意要开得大一些,题目只有到10,所以35差不多啦 void dfs( int k){ if (k==n){ sum++; return ; } for ( int i=0;i<n;i++){ if (!r[i]&&!d1[i+k]&&!d2[i-k+n-1]){ r[i]=1; d1[i+k]=1; d2[i-k+n-1]=1; dfs(k+1); r[i]=0; d1[i+k]=0; d2[i-k+n-1]=0; //对角线这个规律不是唯一的 } } } int main(){ for (n=1;n<=10;n++){ memset (r,0, sizeof (r)); memset (d1,0, sizeof (d1)); memset (d2,0, sizeof (d2)); sum=0; dfs(0); a[n]=sum; } //这步避免的TLE while ( scanf ( "%d" ,&n)!=EOF){ if (n==0) break ; cout<<a[n]<<endl; } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步