Poj 1321 棋盘问题(搜索)
Description
Input
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
Sample Input
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
2
1
分析:回溯法,这题要求的是方案数量。刚开始的时候就是用二维数组暴搜,但是就是不知道怎么判断这个解是不是重复的,因为棋子没有区别,所以4个位置放4个棋子有24种方法,但是如果棋子相同的话就是一种了。想想每次排序再存起来判断的话会超时,所以就采取了按行(以按行为例)或按列搜索的方法来解。从第一行开始搜索,如果这一行中有满足条件的位置就再搜索下一行,如果这一行没有的话就搜索下下行。再加个判断条件,如果超过N的话就结束,这样到了最后一行,有结果就加一,没有就回溯。有了按按搜索这样一个顺序,再加上判断条件,就不会出现重复的排列了。
import java.util.Scanner;
public class Main {
static int N, M;
static boolean[][] path;
static boolean[] xP;
static boolean[] yP;
static int ans;
static void DFS(int row, int n) {
if (n == M) {
ans++;
return;
}
if (row > N) //配合下面DFS(row+1,num); 语句使用,避免搜索越界
return;
for (int j = 1; j <= N; j++) {
if (path[row][j] && !yP[j] && !xP[row]) {
yP[j] = true;
xP[row] = true;
DFS(row + 1, n + 1);
yP[j] = false;
xP[row] = false;
}
}
DFS(row + 1, n);// 如果该行没有合适的位置,搜索下一行。
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
N = sc.nextInt();
M = sc.nextInt();
if (N == -1) {
break;
}
String in[] = new String[N + 1];
path = new boolean[10][10];
xP = new boolean[10];
yP = new boolean[10];
ans = 0;
for (int i = 1; i <= N; i++) {
in[i] = sc.next();
for (int j = 1; j <= N; j++) {
if (in[i].charAt(j - 1) == '#') {
path[i][j] = true;
}
}
}
DFS(0, 0);
System.out.println(ans);
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Poj 1321 棋盘问题(搜索)的更多相关文章
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- DFS POJ 1321 棋盘问题
题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...
- POJ 1321 棋盘问题(C)回溯
Emmm,我又来 POJ 了,这题感觉比上次做的简单点.类似皇后问题.但是稍微做了一点变形,比如棋子数量是不定的.棋盘形状不在是方形等等. 题目链接:POJ 1321 棋盘问题 解题思路 基本思路:从 ...
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44012 Accepted: 21375 Descriptio ...
- POJ 1321 棋盘问题(搜索的方式)
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 47960 Accepted: 23210 Descriptio ...
- POJ 1321 棋盘问题 DFS搜索
简单搜索 练习一下回溯 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- poj 1321 棋盘问题 (DFS深度优先搜索)
Problem Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋 ...
- POJ - 1321 棋盘问题(简单搜索)
题意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方 ...
随机推荐
- complexHeatmap包画分类热图
用途:一般我们画热图是以连续变量作为填充因子,complexHeatmap的oncopoint函数可以以类别变量作为填充因子作热图. 用法:oncoPrint(mat, get_type = func ...
- id和NSObject *和instanceType的区别与联系
id 被成为万能指针,也就是可以指向任何对象. NSObject * 本身就是定义指向NSObject类型的指针. 那么这两者有什么区别吗? 这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区 ...
- Docker 跨主机网络
Docker提供两种原生的跨主机网络: Overlay 和 Macvlan libnetwork & CNM libnetwork 是 docker 容器网络库,最核心的内容是其定义的 C ...
- 实现利用公钥私钥免密码登录Linux服务器
原理 客户端生成公钥私钥,把公钥拷贝给linux服务器,用自己的私钥连接服务器.实现如下: 如果是两台Linux服用器A和B,A来实现免密码登录B A执行ssh-keygen -t rsa 就会在/r ...
- mysql创建定时执行存储过程任务实现订单定时关闭
CREATE PROCEDURE `tableName`.`procedureName`() LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECUR ...
- sqoop学习2(数据导入与导出)
最近学习了下这个导数据的工具,但是在export命令这里卡住了,暂时排不了错误.先记录学习的这一点吧 sqoop是什么 sqoop(sql-on-hadoop):是用来实现结构型数据(如关系型数据库) ...
- ios点击事件失效
当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. 解决办法有 ...
- python 矩阵分成上三角下三角和对角三个矩阵
diagonal Return specified diagonals. diagflat Create a 2-D array with the flattened input as a diago ...
- Unity3d 异常与解决方案集合(持续)
1:更新完unity的5.3.1 版本 后,打开SimpleFrameworld_UGUI 后出现 error CS0117: 'System.IO.Directory' does not conta ...
- Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions
Model compatibility cannot be checked because the database does not contain model metadata. Ensure t ...