http://codeforces.com/contest/585/problem/B
模拟
1
2
3 public class Main {
4 public static void main(String[] args) {
5 Scanner io = new Scanner(System.in);
6 int t = io.nextInt();
7 int[][]g=new int[400][400];
8 //不优化的话队列里会有很多重复成员
9 int[][]vis=new int[400][400];
10 int[]dy=new int[]{0,1,-1};
11
12 OUT:
13 while (t-->0){
14 int x0 =io.nextInt(),k=io.nextInt();
15 for (int i = 0; i < g.length; i++){ Arrays.fill(g[i],'.');Arrays.fill(vis[i],0);}
16
17 ArrayDeque<int[]>q=new ArrayDeque();
18 for (int i = 1; i <= 3; i++) {
19 String s=io.nextLine();while (s.length()==0)s=io.nextLine();
20 for (int j = 0; j < s.length(); j++){
21 if ((g[j+1][i]=s.charAt(j))=='s')q.add(new int[]{j+1,i});
22 }
23 }
24 while (!q.isEmpty()){
25 int[]s=q.poll();int x=s[0],y=s[1];
26
27 //往前走一步
28 int xx=x+1,yy=y;
29 if (g[xx][yy]>='A'&&g[xx][yy]<='Z')continue ;
30
31 //往上走、不动、往下走
32 for (int i = 0; i < dy.length; i++) {
33 yy=y+dy[i];
34 if (yy<1||yy>3)continue ;
35 if (g[xx][yy]>='A'&&g[xx][yy]<='Z')continue ;
36 if (g[xx+1][yy]>='A'&&g[xx+1][yy]<='Z')continue ;
37 if (g[xx+2][yy]>='A'&&g[xx+2][yy]<='Z')continue ;
38
39 if (xx+2>x0){ System.out.println("YES");continue OUT;}
40 if (vis[xx+2][yy]==0) {
41 q.add(new int[]{xx+2,yy});vis[xx+2][yy]=1;
42 }
43
44 }
45 }
46 System.out.println("NO");
47 }
48 }
49
50 }