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个棋子的所有可行的摆放方 ...
随机推荐
- 登陆weblogic后页面控制台卡主
输入http://localhost:7001/console进入控制页面,能登陆进去,但是登陆进去后页面就马上卡死,可以看到页面头部,其余都显示不出来. 重启后启动访问,能够正常进入,关闭weblo ...
- jQuery滑动杆打分插件
在线演示 本地下载
- INSPIRED启示录 读书笔记 - 第32章 提防有特殊要求的产品
产品需求不能用户说了算 1.在看到具体的产品之前,用户很难知道自己需要什么 2.用户不知道什么样的产品是可行的(在目前的技术条件下可以实现) 3.用户之间缺少沟通,需求很难统一 怎样回避特例产品可能带 ...
- servlet原理分析
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- 关于Kinect音频开发的探究
1.笔者在<Kinect体感程序设计入门>(王森著)的这本书中看到可以使用powershell和COM对象无缝整合,轻松的使用windows系统自带的语音合成功能. 步骤:•打开进入pow ...
- linux与windows 通过SecureCRT进行文件传输方式
linux与windows 通过SecureCRT进行文件传输方式 方式一:lrzsz是一款在Linux里可代替ftp上传和下载的程序.(小文件推荐,以4G为界限) # rz -bash: rz: c ...
- webpack 从0 手动配置
1. npm init 2. npm install -D webpack webpack-cli 3. 创建webpack入口文件( 默认 webpack.config.js 可以通过 webpac ...
- 字典:dict.c/dict.h
Redis 源码分析(1):字典和哈希表(dict.c 和 dict.h)http://huangz.iteye.com/blog/1455808两个点:字典结构的运作流程哈希表的渐进式 rehash ...
- Tair分布式缓存
淘宝缓存架构 redis很好用,提供缓存服务.相比memcached多了新数据结构和主从模式增加可用性.不过redis有一点不能满足一些互联网公司开发者需求. re ...
- 迭代式返回 IEnumerable<T>
private IEnumerable<PoliceForceViewModel> CreateResultList(IEnumerable<GPSData> gpsData) ...