POJ 1321 棋盤問題

看到DFS題目,要是沒有想法真的好難,要是思路清晰也真的很容易

此題我一直迷糊當棋子數小於行數子怎麼繼續DFS......當參考了別人的解題報告才明白啊.....此題要不要預處理感覺也沒有大礙吧......只要逐行DFS下去就可以了....

直接貼代碼吧.....DFS and BFS感覺真的好抽象.....慢慢來理解吧

#include<cstdio>
#include<cstring>
const int N=10;
char tmp[N];
int vis[N];
int n, k;
int tot=0;
int map[N][N];
void dfs(int cur, int num)
{
	if(num == k) 
	{
		tot++;
		return;
	}
	if(n+num-cur < k)//剪枝  剩餘行數 小於 剩餘棋子
		return;
	if(cur==n)
		return;
	for(int i=0; i<n; i++)
	{
		if(map[cur][i] && !vis[i])
		{
			vis[i]=1;
			dfs(cur+1,num+1);
			vis[i]=0;
		}
	}
	dfs(cur+1, num);
}
int main()
{
	while(scanf("%d%d",&n, &k) == 2 && n != -1 && k != -1)
	{
		tot=0;
		memset(vis, 0, sizeof(vis));
		memset(map, 0, sizeof(map));
		for(int i=0; i< n; i++)
		{
			scanf("%s",tmp);
			for(int j=0; j<n; j++)
				if(tmp[j] == '#')
					map[i][j]=1;

		}
		dfs(0,0);
		printf("%d\n",tot);
	}
	return 0;
}


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