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;
}
原文地址:https://www.cnblogs.com/jifahu/p/5743883.html