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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章