1. 程式人生 > >棋盤問題 POJ - 1321 DPS

棋盤問題 POJ - 1321 DPS

題目連結

最近開始看DFS了,感覺寫的時候還是有點迷,還是得多練。

題意就是 在“#”的地方可以放棋子,問在棋盤上有多少種可以放的方式。
剛開始以為跟八皇后差不多(只是條件少了),後來發現棋子還不一定是跟行數一樣的。
但思路和方法跟八皇后差不多。

AC程式碼如下:

#include <iostream>
using namespace std;
const int maxn=1e3;
int n,m;
string a[maxn];  //用來存放棋盤。
bool vis[1][maxn]; //用來存放某列的狀態
long long tot=0; //用來統計種類的個數
void dfs(int x,int cnt) //cnt代表行 { if(x==m)//說明擺好了 { tot++; return ; } else if(cnt==n) //如果cnt遍歷到最後一行還沒有達到x==m就返回 return; else { if(n>m)//如果要放的棋子比行數少(不加這個條件會讓行數一樣的也繼續深搜沒必要) dfs(x,cnt+1); //這一行不放 去看下一行 (這裡是跟八皇后不一樣的地方,就是如果棋子少我們可以考慮不放棋子。 for
(int i=0;i<n;i++)//在當前行的遍歷每一列(這一行如果放的話) { if(a[cnt][i]!='.' && !vis[0][i]) { vis[0][i]=true; //改變狀態 dfs(x+1,cnt+1); //繼續查詢下一行 vis[0][i]=false; //切記改變回來! 回溯的思想。 } } } } int main() { while(cin>>
n>>m && n!=-1 && m!=-1) { for(int i=0;i<n;i++) cin>>a[i]; dfs(0,0); cout<<tot<<endl; tot=0; } return 0; }