A-棋盘问题-DFS

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

/*
	棋子放置条件 
	1、 利用dis数组标记数组各列是否放置棋子,同列不能放置棋子
	2、有位置
	函数返回条件
	1、数组遍历结束 
*/
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

char map[100][100];//地图数据 
int chack,sum;	  //已放置棋子数量,方案总数
int dis[100];	  //标记本列是否放置棋子 
int n, k;
void dfs(int a){
	int j;
	if(chack==k){
		sum++;		//方案数加一 
		return ;
	}
	if(a>=n){
		return ;	//遍历结束返回 
	}
	else{
		for(j=0;j<n;j++){
			if(map[a][j]=='#'&&dis[j]==0){//能否放置棋子 
				dis[j]=1;				  //标记该列 
				chack++;				  //放下棋子 
				dfs(a+1);				  //遍历下一行 
				chack--;				  //函数返回后,拿回棋子 
				dis[j]=0;				  //该列标记取消 
			}
		}
		dfs(a+1);				  		  //一行数据遍历结束,遍历下一行 
	}
}
int main(){
	int i, j;
	while(1){
		cin>>n>>k;
		if(n==-1&&k==-1)break;
		for(i=0; i<n; i++)
			for(j=0; j<n; j++)
				cin>>map[i][j];
		chack=sum=0;
		memset(dis,0,sizeof(dis));			//初始化dis数组 
		dfs(0);
		cout<<sum<<endl;		
	}
	return 0;
}


阅读更多
个人分类: 邝斌带你飞
上一篇DFS简单实例-数房子问题
下一篇kuangbin带你飞-K - 迷宫问题 -BFS
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭