void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个棋盘,上面#位置标记可放,然后再给出一个数k,表示要放k个棋子,要求没有两个在同一行和同一列上,输出所有情况个数

dfs问题,dfs(d,k),表示在第d行上放第k个棋子

#include<stdio.h>
#include<string.h>
char ch[10][10];
int f[10],cnt,n;
int DFS(int r,int k)
{
	int j;
	if(k==0)
	{
		cnt++;
		return cnt;
	}
	if(r>=n) return cnt;
	for(j=0;j<n;j++)
	{
		if(!f[j]&&ch[r][j]=='#')
		{
			f[j]=1;
			DFS(r+1,k-1);//进入下一行搜索下一个棋子的位置 
			f[j]=0;
		}
	}
	DFS(r+1,k);
}
int main()
{
	int k,i,j;
	while(scanf("%d%d",&n,&k)&&(n!=-1))
	{
		for(i=0;i<n;i++)
		{
			getchar();
			for(j=0;j<n;j++)
			{
				scanf("%c",&ch[i][j]);
			}
		}
		memset(f,0,sizeof(f));
		cnt=0;
		printf("%d\n",DFS(0,k));	
	}
	return 0;
}
posted on 2011-05-13 13:17  void-man  阅读(170)  评论(0)    收藏  举报