这个题目的深搜形式,我也找出来了,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. Openjudge-计算概论(A)-整数的个数

    描述: 给定k(1<k<100)个正整数,其中每个数都是大于等于1,小于等于10的数.写程序计算给定的k个正整数中,1,5和10出现的次数.输入输入有两行:第一行包含一个正整数k,第二行包 ...

  2. winform实现矩形框截图

    使用方法如下: private void button1_Click(object sender, EventArgs e) { s.GerScreenFormRectangle(); } priva ...

  3. jQuery控制表格行移动,序号不变

    @model Gd.NetSign.Controllers.DTO.SysPamaterDTO @{ ViewBag.Title = "SysPamatList"; //Layou ...

  4. 批量去除office超链接

    mac下: fn+shift+comman+F9 windows下:control+shift+F9

  5. linux下写脚本时-gt是什么意思

    -eq 等于-ne 不等于-gt 大于-ge 大于等于-lt 小于-le 小于等于

  6. 正则表达式 Pattern & Matcher

    1 compile and pattern Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(Strin ...

  7. [NPOI2.0] 使用NPOI读取和导出Excel文件

    先来说下一直使用的 Microsoft.Office.Interop.Excel ,在系统正式使用时遇到的问题 1:Excel读取数据BUG 由于使用Microsoft.Office.Interop. ...

  8. 点赞增加的jquery写法

    $('.dianzan').click(function(){ $(this).find('span').html(parseInt($(this).find('span').html())+1) } ...

  9. InjectAPC全部项目(Win32和Win64位)

    // InjectAPC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #inclu ...

  10. A框架第一步,传递不同参数.主程序执行对应方法

    访问: www.test.com/admin 1============后台目录:admin (确保单一入口) --有入口文件index.php <?phprequire '../A/a.php ...