百練 棋盤問題(DFS)

一開始想的時候標記想錯了,其實標記只要一組對列的標記就夠,這樣在行往下的過程中,行每行確定只放一個了,與一般dfs還有一點不同的是,這個有可能出現棋子數不足的情況,這就要求在dfs過程中,需要分放和不放兩種,在放的部分中代碼再體現出行的標記變換

還有個有點陰的地方是#是可以放的,迷宮題做多了都默認#是不行的了  - -

題目鏈接

#include <iostream>
#include <cstring> 
using namespace std;
int n,k;
int vis[10];
char m[10][10];
int count = 0;
int total = 0;

void dfs(int x)
{

	if(total==k)
	{
		count++;
		return ;
	}
	if(x>=n)
	{
		return ;
	}
	for(int j=0;j<n;j++)//在這一行放 
	{
		if(vis[j]==0&&m[x][j]=='#')//只考慮同一列不能放 
		{
			vis[j] = 1;
			total++;  
			dfs(x+1);
			vis[j] = 0;
			total--;
		}
	}
	
	dfs(x+1);// 因爲不等額 在這一行直接不放 
}

int main(void)
{
	while(1)
	{
		total = 0;
		count = 0;
		memset(vis,0,sizeof(vis));
		scanf("%d%d",&n,&k);
		if(n==-1&&k==-1)
		{
			return 0;
		}
		for(int i=0;i<n;i++)
		{
			scanf("%s",m[i]);	
		} 
		dfs(0);
		printf("%d\n",count);
	} 
} 

 

發佈了85 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章