A-棋盘问题-DFS

原创 2018年04月16日 12:09:18

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

点击打开链接#include #include #include #include #include #include #include #include #include #include #inc...
  • u013554860
  • u013554860
  • 2016-06-02 17:29:57
  • 334

DFS深度优先搜索(2)--poj1321(棋盘问题 经典DFS)

棋盘问题  Time Limit:1000MS    Memory Limit:10000KB    64bit IO Format:%lld & %llu Description...
  • Acmer_Sly
  • Acmer_Sly
  • 2016-09-10 14:17:41
  • 1843

(kuangbin DFS)棋盘问题

Time Limit:1000MS    Memory Limit:10000KB    64bit IO Format:%lld & %llu SubmitStatusPracticePOJ 1...
  • qq_33901297
  • qq_33901297
  • 2016-09-19 21:27:26
  • 204

POJ 1321 棋盘问题(dfs)

       讲一下大概思路,因为题目上要求棋子不能在同一行或同一列种出现,所以我们可以按行、列来进行搜索,一行一行的搜索,然后标记搜索到的那一列,然后再往下继续搜索。结合代码看吧。AC代码:#inc...
  • Charles_Zaqdt
  • Charles_Zaqdt
  • 2018-02-14 16:34:01
  • 37

(POJ1321) 棋盘问题 <DFS ,八皇后问题的变形,皇后数目小于等于行数即有些行可以不放>

[TOC] 棋盘问题 Description在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和...
  • STILLxjy
  • STILLxjy
  • 2016-11-20 16:23:33
  • 491

骑士周游问题(马踏棋盘问题)DFS

马踏棋盘算法(骑士周游问题) 定义:将马随机放在国际象棋的8×8棋盘Board[0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。 如图: 用一个...
  • MagicScaring
  • MagicScaring
  • 2016-04-15 16:35:17
  • 712

棋盘问题 BNUOJ 1440

棋盘问题 Time Limit: 1000ms Memory Limit: 10000KB问题描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋...
  • lvxin1204
  • lvxin1204
  • 2016-03-31 16:50:44
  • 2790

C语言DFS(4)____棋盘问题

Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k...
  • y1196645376
  • y1196645376
  • 2014-11-11 13:12:04
  • 944

A-棋盘问题

题目链接: https://vjudge.net/contest/65959#problem/A 题目大意 让你输入两个数字n,k。n代表一个n*n的棋盘, k代表你要给里面放的棋子,’#’...
  • super604zong
  • super604zong
  • 2017-03-04 09:50:49
  • 208

Sicily 1152 简单的马周游问题[Special judge]

深搜,但是要每一步都搜索时要依照下一步能走到的格子数从小到大进行搜索,不然会超时 // Problem#: 1152 // Submission#: 3241599 // The source co...
  • mayer314
  • mayer314
  • 2014-11-27 17:46:37
  • 251
收藏助手
不良信息举报
您举报文章:A-棋盘问题-DFS
举报原因:
原因补充:

(最多只允许输入30个字)