UVALive 7299 Boggle(深搜的姿势)

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

  后来的各种TIE我就表示不能理解了……我换了好多个姿势,改了各种各样的形式,最后改的快跟学长一模一样了,还是TLE……WTF,真是见了鬼了,最后我发现学长的代码里,字符串的长度没有作为参数传进去,而是在里面直接计算的,我的是把长度计算好了,存起来,直接传参进入递归。结果还真就是因为这个,TLE了,我把这个参数去了以后用各种编译器都是3msAC。加上去以后就各种超时……至于是为什么……我现在还不知道,你们要是有谁知道告诉我一声啊…… 反正以后我也会注意这方面的原因,在深搜里,尽量少放参数……

  总体来说,题目并不难,只是我入坑了……

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 20
string dic[220];
int w,D,go[8][2] = {{1,0},{-1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
int vis[N][N];
char maps[N][N];
bool flag;
void dfs(int k,int num,int nowx,int nowy)
{
    if(flag) return;
    int len = dic[k].length();
    if(maps[nowx][nowy] == ‘q‘)
    {
        if(num+1<len && dic[k][num+1] == ‘u‘)
            num++;
        else return;
    }
    if(num == len-1)
    {
        flag = true;
        return ;
    }
    int xx,yy;
    vis[nowx][nowy] = 1;
    for(int i = 0; i < 8; i++)
    {
        xx = nowx + go[i][0];
        yy = nowy + go[i][1];
        if(xx>=0&&xx<D&&yy>=0&&yy<D && maps[xx][yy] == dic[k][num+1] && !vis[xx][yy])
        {
            dfs(k,num+1,xx,yy);
        }
    }
    vis[nowx][nowy] = 0;
}
bool can_out(int k)
{
    for(int i = 0; i < D; i++)
    {
        for(int j = 0; j < D; j++)
        {
            if(dic[k][0] == maps[i][j])
            {
                flag = false;
                memset(vis,0,sizeof(vis));
                dfs(k,0,i,j);
                if(flag) return true;
            }
        }
    }
    return false;
}
int main()
{
//    freopen("I.in.cpp","r",stdin);
    while(~scanf("%d",&w) && w)
    {
        for(int i = 0; i < w; i++)
        {
            cin>>dic[i];
        }
        sort(dic,dic+w);
        while(~scanf("%d",&D))
        {
            if(D==0) break;
            for(int i = 0; i < D; i++)
            {
                scanf("%s",maps[i]);
            }
            for(int i = 0; i < w; i++)
            {
                if(can_out(i)) cout<<dic[i]<<endl;
            }
            puts("-");
        }
    }
    return 0;
}
时间: 2024-10-10 16:13:35

UVALive 7299 Boggle(深搜的姿势)的相关文章

UVALive 6948 Jokewithpermutation 深搜

题意就是把一段序列拆成从1到n的形式 一开始暴力了一下 后来发现bug太多一定是思路不对…… #include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<map> #include<vector> #include<queue> #define M(a,b) memse

UVALive 2053 Puzzlestan(深搜+技巧)

这个题目的深搜形式,我也找出来了,dfs(i,j)表示第i个人选到了第j个物品,但是我却无限RE了,原因是我的viod型深搜太过暴力,我当时定义了一个计数器,来记录并限制递归的层数,发现它已经递归到了1500层,加上限制后,WA了……后来学习了网上的方法,使用bool型的深搜,每一次选择都去跟题目中给的限制去比较,看这次选择有没有冲突,如果没有搜下一个,当搜到false的时候,及时停止,节省了时间和空间. 伪代码: if(dfs(next)==true) return true: else re

UVALive 2403 77377解题报告(深搜)

题意:给你一些固定的字符串,在给出数字,根据键盘的对应关系,输出所有的满足条件的字符串,输出顺序无所谓. 思路:因为题目说了,输出比较小,说明测试数据并不强,所以可以暴力回溯求出答案,将所有的给出的字符串压缩为数字,再将对应相同数字的字符串存储起来(当时忘了这里,WA了几次),然后深搜即可. 注意:多个字符串有可能对应相同的数字,需要另外存储,在深搜的时候,枚举这个符合条件的字符串. 代码如下: #include<iostream> #include<cstdio> #includ

hdu1455 Sticks 深搜 强剪枝

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6035    Accepted Submission(s): 1704 Problem Description George took sticks of the same length and cut them randomly until all parts becam

深搜笔记

看搜索已经很久了,对于搜索的思想从原来的死记硬背到现在终于懂了一点其实也蛮不错吧,我自己先总结出来了几条关于在图里面深搜的几条方法,仅供参考: 首先:我们得知道深搜是什么,其次于广搜的区别是什么.然后又哪些模板 举一个深搜例子:red and black:这是初学者最常见到的题.对于这题我们所要考虑的就是一个'.'的个数,这个题先要找到@的位置,这个好办,直接: for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(map[i][j]=='@') }

HDU1342 Lotto 【深搜】

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色的. 你需要通过一系列操作使得最终每个点变成黑色.每次操作需要选择一个节点i,i必须是白色的,然后i到根的链上(包括节点i与根)所有与节点i距离小于k[i]的点都会变黑,已经是黑的点保持为黑.问最少使用几次操作能把整棵树变黑. 输入描述: 第一行一个整数n (1 ≤ n ≤ 10^5) 接下来n-1

poj1190 生日蛋糕(深搜+剪枝)

题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到小试 剪枝: ①已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建(最优性剪枝) ②预见到再往上搭,高度已经无法安排,或者半径无法安排,则停止搭建(可行性剪枝) ③还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝) ④还没搭的那些层的