日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

皇后问题

發布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 皇后问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Submit?Status

Description

在N*N的方格棋盤放置了N個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。?
你的任務是,對于給定的N,求出有多少種合法的放置方法。?

Input

共有若干行,每行一個正整數N≤10,表示棋盤和皇后的數量;如果N=0,表示結束。

Output

共有若干行,每行一個正整數,表示對應輸入行的皇后的不同放置數量。

Sample Input

1 8 5 0

Sample 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位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的皇后问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。