这个题目的深搜形式,我也找出来了,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(深搜+技巧)的更多相关文章

  1. UVALive 6948 Jokewithpermutation 深搜

    题意就是把一段序列拆成从1到n的形式 一开始暴力了一下 后来发现bug太多一定是思路不对…… #include<stdio.h> #include<iostream> #inc ...

  2. UVALive 7299 Boggle(深搜的姿势)

    一开始确实是我的锅,我把题意理解错了,以为是一个q周围没有q的时候才可以当时qu,其实是只要碰到q,他就是qu,所以我们也可以通过预处理的方式,把字典中的不满足qu连在一起的直接去掉. 后来的各种TI ...

  3. UVALive 2403 77377解题报告(深搜)

    题意:给你一些固定的字符串,在给出数字,根据键盘的对应关系,输出所有的满足条件的字符串,输出顺序无所谓. 思路:因为题目说了,输出比较小,说明测试数据并不强,所以可以暴力回溯求出答案,将所有的给出的字 ...

  4. 一本通例题埃及分数—题解&&深搜的剪枝技巧总结

    一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化 ...

  5. 小结:A* & IDA* & 迭代深搜

    概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...

  6. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  7. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  8. 利用深搜和宽搜两种算法解决TreeView控件加载文件的问题。

    利用TreeView控件加载文件,必须遍历处所有的文件和文件夹. 深搜算法用到了递归. using System; using System.Collections.Generic; using Sy ...

  9. 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 ...

随机推荐

  1. CodeForces 697B Barnicle 模拟

    强行模拟 纪念一下…… #include<stdio.h> #include<iostream> #include<algorithm> #include<m ...

  2. 酷比魔方 iwork10 旗舰版

    平板电脑自带的win10的一键恢复不是一般的慢,简直慢出个性了,历经5个小时...必须是个有耐心的人才敢一键恢复,不然强制关机就变砖了...

  3. COM与.NET程序集导出和部署COM组件

    为了分布式和多客户端调用我们还需要将写好的COM组件发布到一台服务器上.这里我们将组件部署到操作系统的COM+应用程序中去.如果没此需要就可以导出后,在C++环境中调用COM了. 第一步:导出COM组 ...

  4. 不自动切换eclipse视图

    刚开始使用eclipse进行调试时,当弹出"Confir Perspective Switch"视图时,不小心点了“No”.以后每次debug的时候都不切换到debug视图. 后发 ...

  5. 【第三篇】学习 android 事件总线androidEventbus之list数据事件的传递,发送list数据事件到另外一个Activity

    这个和普通的事件总线的发送接收一样. package com.example.mysimpleeventbus; import java.util.ArrayList; import java.uti ...

  6. git 免密码提交代码

    Linux或者Mac下方法: 创建文件,进入文件,输入内容: cd ~ touch .git-credentials vim .git-credentials https://{username}:{ ...

  7. 【01-14】hibernate时间生成

    package rugal.sample.core.entity; import java.util.Date; import java.util.UUID; import javax.persist ...

  8. 关于C++中字符的转换

    VS的工程属性中我们常会设置Character Set:

  9. linux查看内核版本

    cat /proc/version 或者 cat /etc/issue 或者 uname -a

  10. 第十四节,基本数据类型,列表list

    创建列表  #!/usr/bin/env python # -*- coding:utf-8 -*- a = ['alex', 'seven', 'eric'] #或 a = list(['alex' ...