棋盤問題 POJ - 1321 DPS
阿新 • • 發佈:2018-12-26
最近開始看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;
}