专题一搜索 C - Computer Game
- 题目
Monocarp is playing a computer game. Now he wants to complete the first level of this game.
A level is a rectangular grid of 22 rows and nn columns. Monocarp controls a character, which starts in cell (1, 1) — at the intersection of the 11-st row and the 11-st column.
Monocarp's character can move from one cell to another in one step if the cells are adjacent by side and/or corner. Formally, it is possible to move from cell (x1,y1) to cell (x2,y2) in one step if ∣x1−x2∣≤1 and ∣y1−y2∣≤1. Obviously, it is prohibited to go outside the grid.
There are traps in some cells. If Monocarp's character finds himself in such a cell, he dies, and the game ends.
To complete a level, Monocarp's character should reach cell (2, n) — at the intersection of row 22 and column nn.
Help Monocarp determine if it is possible to complete the level.
InputThe first line contains a single integer tt (1 \le t \le 1001≤t≤100) — the number of test cases. Then the test cases follow. Each test case consists of three lines.
The first line contains a single integer nn (3 \le n \le 1003≤n≤100) — the number of columns.
The next two lines describe the level. The ii-th of these lines describes the ii-th line of the level — the line consists of the characters '0' and '1'. The character '0' corresponds to a safe cell, the character '1' corresponds to a trap cell.
Additional constraint on the input: cells (1, 1) and (2, n) are safe.
OutputFor each test case, output YES if it is possible to complete the level, and NO otherwise.
ExampleInput4 3 000 000 4 0011 1100 4 0111 1110 6 010101 101010
OutputYES YES NO YES
Consider the example from the statement.
In the first test case, one of the possible paths is(1,1)→(2,2)→(2,3).
In the second test case, one of the possible paths is (1,1)→(1,2)→(2,3)→(2,4).
In the fourth test case, one of the possible paths is (1,1)→(2,2)→(1,3)→(2,4)→(1,5)→(2,6).
- 思路
比B题那个跳马样板题还简单,设置5个方向搜就完了
此外还有个简便方法:某一列两个都是1那么必定不能跳过去,除此之外都行 - 代码
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> using namespace std; int t,n,nx,ny; int vis[3][105]; int map[3][105]; int main() { scanf("%d",&t); for(int i=0;i<t;i++) { int flag=0; scanf("%d",&n); for(int i=1;i<=2;i++) { for(int j=1;j<=n;j++) { scanf("%1d",&map[i][j]); } } queue<int>qx,qy; qx.push(1),qy.push(1); vis[1][1]=1; while(!qx.empty()&&!qy.empty()) { nx=qx.front(),qx.pop(); ny=qy.front(),qy.pop(); if(nx==2&&ny==n) { flag=1; break; } if(nx-1>=1&&ny+1<=n&&vis[nx-1][ny+1]==0&&map[nx-1][ny+1]==0) { qx.push(nx-1); qy.push(ny+1); vis[nx-1][ny+1]=1; } if(ny+1>=0&&vis[nx][ny+1]==0&&map[nx][ny+1]==0) { qx.push(nx); qy.push(ny+1); vis[nx][ny+1]=1; } if(nx+1<=2&&ny+1<=n&&vis[nx+1][ny+1]==0&&map[nx+1][ny+1]==0) { qx.push(nx+1); qy.push(ny+1); vis[nx+1][ny+1]=1; } if(nx-1>=1&&vis[nx-1][ny]==0&&map[nx-1][ny]==0) { qx.push(nx-1); qy.push(ny); vis[nx-1][ny]=1; } if(nx+1<=2&&vis[nx+1][ny]==0&&map[nx+1][ny]==0) { qx.push(nx+1); qy.push(ny); vis[nx+1][ny]=1; } } memset(vis,0,sizeof(vis)); if(flag) { printf("YES\n"); } else { printf("NO\n"); } memset(map,0,sizeof(map)); } return 0; }