1. 程式人生 > >搜索題結題報告

搜索題結題報告

分享 ring cin 一加 com 部分 pre col bsp

N皇後問題(洛谷P1219八皇後)

輸入n(6<=n<=13),輸入n皇後的前三個解以及解的個數

DFS題,首先是從上到下枚舉的,所以橫向不會重復,而且有used變量,豎向不重復

如果用函數枚舉和(deep,i)是否在一條線上,經過測試後,題目會卡n=13,如果把圖畫出來

綠色部分滿足a[i]-i=i-deep,紅色部分滿足a[j]+j=deep+j;

(垂直向為i,其橫坐標為a[i])采用同used一樣的思路可以得出利用變量表示

而綠色因為涉及到減法可能負數(C++不支持負下標)統一加20即可

技術分享

#include <iostream>
#include 
<cstdio> #include <cstring> #include <cstdlib> using namespace std; int ans,n; int zx[40],fx[40]; int a[15],used[15]; void DFS(int deep){ if(deep>n){ ans++; if(ans<=3){ for(int i=1;i<=n;i++)printf("%d ",a[i]); printf("\n
"); } return; } for(int i=1;i<=n;i++){ if(zx[deep+i]==0 && fx[20+deep-i]==0 && used[i]==0){ a[deep]=i; used[i]=1; zx[deep+i]=1; fx[20+deep-i]=1; DFS(deep+1); used[i]
=0; a[deep]=0; zx[deep+i]=0; fx[20+deep-i]=0; } } } int main(){ cin>>n; DFS(1); cout<<ans; }

搜索題結題報告