CodeForces 586D【BFS】
题意:
s是这个人开始位置;连续相同大写字母是 Each of the k trains,相应的火车具有相应的字母;
'.' 代表空;
有个人在最左列,上面有连续字母代表的火车,火车从左边出去的话,会从右边继续进来,
一开始是人先往右走一步,然后上下或者一步,然后火车往左移两步。
BFS;
s是这个人开始位置;连续相同大写字母是 Each of the k trains,相应的火车具有相应的字母;
'.' 代表空;
有个人在最左列,上面有连续字母代表的火车,火车从左边出去的话,会从右边继续进来,
一开始是人先往右走一步,然后上下或者一步,然后火车往左移两步。
n有100,代表长度,k代表火车的数量;
思路:BFS;
走完还要再走两个= =、妈个鸡啊。
一开始一直踏马地觉得没必要BFS,没必要BFS...后面搞懂了之前比赛中的思路是递推,也就是DP,但是踏马的DP递推真的写成了递推,往下乱搞。。。
感觉如果BFS简单清晰就直接上手啊!= =况且明明搜索擅长还不写,真是不好好想想就直接pass方案,真是蠢到家了!
贴一发挫代码//
#include <bits/stdc++.h> using namespace std; typedef long long LL; char ma[5][110]; bool vis[5][110]; struct asd{ int x,y; }; queue<asd>q; int n,k; bool Judge(int x,int y) { if(x<0||x>=3||vis[x][y]||ma[x][y]!='.') return 0; return 1; } void solve_down(asd next) { next.x++; if(Judge(next.x,next.y)) { next.y++; if(Judge(next.x,next.y)) { next.y++; if(Judge(next.x,next.y)) { vis[next.x][next.y]=1; q.push(next); } } } } void solve_up(asd next) { next.x--; if(Judge(next.x,next.y)) { next.y++; if(Judge(next.x,next.y)) { next.y++; if(Judge(next.x,next.y)) { vis[next.x][next.y]=1; q.push(next); } } } } int main() { int T; scanf("%d",&T); while(T--) { while(!q.empty()) q.pop(); memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&k); for(int i=0;i<3;i++) scanf("%s",ma[i]); ma[0][n]=ma[0][n+1]='.'; ma[1][n]=ma[1][n+1]='.'; ma[2][n]=ma[2][n+1]='.'; asd now,next; for(int i=0;i<3;i++) if(ma[i][0]=='s') { now.x=i; now.y=0; break; } q.push(now); bool flag=0; while(!q.empty()) { now=q.front(); q.pop(); if(now.y>=n-1) { flag=1; break; } next.x=now.x; next.y=now.y+1; if(!Judge(next.x,next.y)) continue; solve_down(next); solve_up(next); next.y++; if(Judge(next.x,next.y)) { next.y++; if(Judge(next.x,next.y)) { vis[next.x][next.y]=1; q.push(next); } } } if(flag) puts("YES"); else puts("NO"); } return 0; }