程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1321 棋盤問題(搜索)

POJ 1321 棋盤問題(搜索)

編輯:C++入門知識

POJ 1321 棋盤問題(搜索)


 

 

 


Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28825   Accepted: 14276

 

Description

在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。

Input

輸入含有多組測試數據。
每組數據的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當為-1 -1時表示輸入結束。
隨後的n行描述了棋盤的形狀:每行有n個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多余的空白行或者空白列)。

Output

對於每一組數據,給出一行輸出,輸出擺放的方案數目C (數據保證C<2^31)。

Sample Input

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

Sample Output

2
1

 

一做搜索的題目,就有著開兩個數組dx[],dy[],來進行搜索的定式思維,其實那個就是用來走迷宮的。。

 

題目要求選擇的棋子不同行,不同列,所以我們可以一行一行的搜索,找到了 # 就直接進入下一行

這樣首先保證了不同行,然後再開一個vis【】數組,用來記錄棋子所在列數,深搜即可。

 

【源代碼】

 

 

#include
#include 
#include 
using namespace std;
int n,k,ans;
char map[10][10];
bool vis[10];
void dfs(int cur,int cnt){
	if(cnt==k)
	{
		ans++; return; 
	}
	if(cur>n)  //如果超過最後一行 
		return ;
	for(;cur<=n;cur++) //起點從第一排開始搜
		for(int j=1;j<=n;j++){
			 if(map[cur][j]=='#'&&!vis[j]){
				vis[j]=1;
				dfs(cur+1,cnt+1);
				vis[j]=false;//回溯
			}
	}
	
}
int main(){
	while(scanf(%d%d,&n,&k)!=EOF&&n!=-1&&k!=-1){
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				scanf( %c,&map[i][j]);
			}
		ans = 0;
		dfs(1,0);
		printf(%d
,ans);
	}
	return 0;
}

 


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved