皇后问题
Submit?Status
你的任務是,對于給定的N,求出有多少種合法的放置方法。?
Description
在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。?你的任務是,對于給定的N,求出有多少種合法的放置方法。?
Input
共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。Output
共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。Sample Input
1 8 5 0Sample Output
1 92 10 這道題有一個難點就是不允許皇后處在與棋盤邊框成45角的斜線這一條件,看了別的大神的博客才發現,每一點都會處在一條斜線上,需要做的就是判斷那一條斜線上是否已經存在皇后即可。 接下來枚舉每一行的位置,每次都與之前所放置過的位置判斷,直到找到最優位置。 額,這道題雖然用了遞歸的方法和DFS的名字,不過真正使用的卻是回溯而已.#include"iostream"
#include"cstring"
using namespace std;
int n;
int temp;
int a[11];
void DFS(int step)
{
if(step==n+1)
{
temp++;
return;
}
int flag;
for(int i=1;i<=n;i++)
{
a[step]=i;
flag=0;
for(int j=1;j<step;j++)
{
if(a[j]==i||i-step==a[j]-j||i+step==a[j]+j)
{
flag=1;
break;
}
}
if(flag==0) {DFS(step+1);}
}
}
int main()
{
int ans[11];
for(n=1;n<=10;n++)
{
temp=0;
memset(a,0,sizeof(a));
DFS(1);
ans[n]=temp;
}
int m;
while(cin>>m&&m)
cout<<ans[m]<<endl;
return 0;
}
?
翻了翻紫書,發現有DFS的解題方法,相較回溯而言,效率高了一些
回溯:46ms
DFS:31ms
#include"iostream" #include"cstring" using namespace std; int n; int temp; int book[110][110]; void DFS(int step) { if(step==n+1) { temp++; return; } for(int i=1;i<=n;i++) { if(!book[0][i]&&!book[1][step+i]&&!book[2][step-i+n]) { //a[step]=i; book[0][i]=book[1][step+i]=book[2][step-i+n]=1; DFS(step+1); book[0][i]=book[1][step+i]=book[2][step-i+n]=0; } } } int main() { int ans[11]; for(n=1;n<=10;n++) { temp=0; memset(book,0,sizeof(book)); DFS(1); ans[n]=temp; } int m; while(cin>>m&&m) cout<<ans[m]<<endl; return 0; }?
轉載于:https://www.cnblogs.com/zsyacm666666/p/4664793.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 修改eclipse启动时eclipse使
- 下一篇: cmd常见命令