UVALive 2053 Puzzlestan(深搜+技巧)
这个题目的深搜形式,我也找出来了,dfs(i,j)表示第i个人选到了第j个物品,但是我却无限RE了,原因是我的viod型深搜太过暴力,我当时定义了一个计数器,来记录并限制递归的层数,发现它已经递归到了1500层,加上限制后,WA了……后来学习了网上的方法,使用bool型的深搜,每一次选择都去跟题目中给的限制去比较,看这次选择有没有冲突,如果没有搜下一个,当搜到false的时候,及时停止,节省了时间和空间。
伪代码: if(dfs(next)==true) return true; else return false; 这样我们在很有可能在选某一个数的时候,发现已经没有合适方案,及时停止递归,而不是我那种每次都递归到最底层。
注意:我的代码比较短,但是耗时83MS,源代码很长,耗时3MS,区别是判断冲突的方法不一样,读者可以自己思考其他的判定方法,应该还有很多。
再就是我的做了一步优化,我们可以从第二个物品开始选,这样也保证了题目的输出正确。
最后,UVAlive的oj好奇葩,我自己的代码WA时,还感觉很奇怪,后来发现少了换行,它怎么就是不返回PE呢……被坑好多次……
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define N 10
struct Check{
int a,b,c,d;
char op[];
}ch[];
char maps[N][N];
int n,m,cnt,belong[N][N];
bool dfs(int ci,int cj){
int a,b,c,d,flag;
char op;
if(ci==m+ && cj == ){
return true;
}
for(int i = ;i <= m;i++){
if(belong[cj][i]) continue;
belong[cj][i] = ci;
flag = ;
for(int j = ;j < cnt;j++){
a = ch[j].a; b = ch[j].b;
c = ch[j].c; d = ch[j].d;
op = ch[j].op[];
if((!belong[a][b]) || (!belong[c][d])) continue;
if(op=='R'&&belong[a][b] != belong[c][d]){
flag = ;
break;
}
if(op=='N'&&belong[a][b] == belong[c][d]){
flag = ;
break;
}
}
if(!flag){
belong[cj][i] = ;
continue;
}
if(cj==n){
if(dfs(ci+,)) return true;
}
else if(dfs(ci,cj+)) return true;
belong[cj][i] = ;
}
return false;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i = ;i <= n;i++){
scanf("%s",maps[i]+);
}
for(cnt = ;true;cnt++){
scanf("%d%d%s%d%d",&ch[cnt].a,&ch[cnt].b,ch[cnt].op,&ch[cnt].c,&ch[cnt].d);
if(ch[cnt].a == ){
break;
}
}
memset(belong,,sizeof(belong));
for(int i = ;i <= m;i++) belong[][i] = i;
dfs(,);
for(int i = ;i <= m;i++){
for(int j = ;j <= n;j++){
for(int k = ;k <= m;k++){
if(belong[j][k]==i){
printf("%c",maps[j][k]);
}
}
}
printf("\n");
}
printf("\n");
}
return ;
}
UVALive 2053 Puzzlestan(深搜+技巧)的更多相关文章
- UVALive 6948 Jokewithpermutation 深搜
题意就是把一段序列拆成从1到n的形式 一开始暴力了一下 后来发现bug太多一定是思路不对…… #include<stdio.h> #include<iostream> #inc ...
- UVALive 7299 Boggle(深搜的姿势)
一开始确实是我的锅,我把题意理解错了,以为是一个q周围没有q的时候才可以当时qu,其实是只要碰到q,他就是qu,所以我们也可以通过预处理的方式,把字典中的不满足qu连在一起的直接去掉. 后来的各种TI ...
- UVALive 2403 77377解题报告(深搜)
题意:给你一些固定的字符串,在给出数字,根据键盘的对应关系,输出所有的满足条件的字符串,输出顺序无所谓. 思路:因为题目说了,输出比较小,说明测试数据并不强,所以可以暴力回溯求出答案,将所有的给出的字 ...
- 一本通例题埃及分数—题解&&深搜的剪枝技巧总结
一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化 ...
- 小结:A* & IDA* & 迭代深搜
概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
- 利用深搜和宽搜两种算法解决TreeView控件加载文件的问题。
利用TreeView控件加载文件,必须遍历处所有的文件和文件夹. 深搜算法用到了递归. using System; using System.Collections.Generic; using Sy ...
- 2016弱校联盟十一专场10.3---Similarity of Subtrees(深搜+hash、映射)
题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52310 problem description Define the depth of a ...
随机推荐
- poj 3278 Catch That Cow bfs
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...
- RHCE备考倒计时
2014年7月31日 周四 上海考试 认证RHCE6
- tableview 代理方法详解
typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) { UITableViewCellAccessoryNone, // 不显示任何图标 ...
- 对http协议断点续传的理解
断点续传指的是下载传输文件可以中断,之后重新下载时可以接着中断的地方开始下载,而不必从头开始下载.断点续传需要客户端和服务端都支持. 原理是客户端一块一块的请求数据,最后将下载回来的数据块拼接成完整的 ...
- 将MyEclipse中的项目导入到Eclipse中报错的解决放法
1.导入项目后,会报红色感叹号, 将项目右键,点击红色框.
- Jquery EasyUI datagrid后台数据表格生成及分页详解
由于项目原因,网站后台需要对用户信息进行各种操作,有时还需要进行批量操作,所以首先需要将用户信息展示出来,查了不少资料.发现Jquery EasyUI确实是一个不错的选择,功能强大,文档也比较全面,而 ...
- [转载]Winform中Control的Invoke与BeginInvoke方法
转自http://www.cppblog.com/baby-fly/archive/2010/04/01/111245.html 一.为什么 Control类提供了 Invoke和 BeginInvo ...
- forEach用法介绍
array.forEach(callback[, thisArg]) forEach() 方法让数组的每一项都执行一次给定的函数. callback在数组每一项上执行的函数,接收三个参数: curre ...
- android命令行网络时间同步
一.简介 Android基于Linux平台的开源手机操作系统. 二.原理 既然是Linux,那就应该支持linux的各种命令行,高度的可配置,但实验发现Android是Google的一个高度阉割版的l ...
- DOM操作-遍历HTML文档内容
基础: JS nodeType返回类型:http://blog.csdn.net/qyf_5445/article/details/9232907 代码: <!DOCTYPE html> ...