一开始确实是我的锅,我把题意理解错了,以为是一个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