poj 1321 棋盘问题【dfs】

棋盘问题
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 28308   Accepted: 13996

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

题意:汉语题就不用多解释了吧
#include<stdio.h>
#include<string.h>
char map[10][10];
int n,k,tot,max;
int judge(int r,int c)
{
	int i;
	if(map[r][c]!='#') return 0;
	for(i=r-1;i>=0;i--)//判断当前点同一列上,上侧是否已经放置 
	{
		if(map[i][c]=='o')
		return 0;
		if(map[i][c]=='.')
		continue;
	}
	for(i=c-1;i>=0;i--)//判断当前点同一行上左侧是否已经放置
	{
		if(map[r][i]!='.')
		continue;
		if(map[r][i]=='o')
		return 0;
	}
	return 1;
}
void dfs(int x,int tot)
{
	int i,j;
	int t;
	if(tot==k) 
		max++;
	else if(x==n) return;
	else
	{
		for(i=0;i<n;i++)
		{
			if(judge(x,i))
			{
				map[x][i]='o';//标记已经放过的位置 
			    dfs(x+1,tot+1);//搜索下一行 
			    map[x][i]='#';//如果上个搜索失败,或者搜索到了结尾 
			}                 //回溯时取消标记 
		}
		dfs(x+1,tot);//如果上一行没有可以放得位置则开始搜索下一行 
	}
} 
int main()
{
	int i;
	while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1)
	{
		for(i=0;i<n;i++)
		scanf("%s",map[i]);
		max=0;
		dfs(0,0);
		printf("%d\n",max);
	}
	return 0;
} 

  

posted @ 2015-08-05 14:37  非我非非我  阅读(176)  评论(0编辑  收藏  举报