HDU 2553
中文題。
思路:用for循環往每一行里放皇后,x[]存的數是列數,要判斷是否在同一斜線上,條件是abs(列數相減)==abs(行數相減):解釋一下,如果兩個點左低右高的話,那么他們的行列數之和相等;如果兩個點左高右低的話,那么他們行數之差和列數之差相同;兩個條件合并起來就是上面那個,當然也可以不作改動,直接判斷兩個條件。
AC代碼:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f using namespace std; int x[12],sum,ans[12],N; bool dfs(int n) {for(int i=1; i<n; i++){if(x[i]==x[n]||abs(n-i)==abs(x[i]-x[n]))//判斷條件 {return false;}}return true; }void TJ(int k) {if(k>N)//如果已經放了N個皇后,sum++; {sum++;}else{for(int i=1; i<=N; i++){x[k]=i;if(dfs(k))//如果第N個皇后放的下去,繼續下面遞歸;否則遞歸結束,進行下一個循環,典型回溯 {TJ(k+1);}}} } int main() {for(N=1; N<=10; N++)//先把10的表打好,直接查詢。 {sum=0;TJ(1);ans[N]=sum;}int n;while(~scanf("%d",&n)&&n){printf("%d\n",ans[n]);}return 0; } View Code?
轉載于:https://www.cnblogs.com/qioalu/p/4905023.html
總結
- 上一篇: 怎么看自己硬盘 查看自己硬盘的方法
- 下一篇: ARM Cortex Debug Por