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)(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 (x_1, y_1)(x1,y1) to cell (x_2, y_2)(x2,y2) in one step if |x_1 - x_2| \le 1∣x1−x2∣≤1 and |y_1 - y_2| \le 1∣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)(2,n) — at the intersection of row 22 and column nn.
Help Monocarp determine if it is possible to complete the level.
Input
The 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)(1,1) and (2, n)(2,n) are safe.
Output
For each test case, output YES if it is possible to complete the level, and NO otherwise.
Example
4 3 000 000 4 0011 1100 4 0111 1110 6 010101 101010
YES YES NO YES
Note
Consider the example from the statement.
In the first test case, one of the possible paths is (1, 1) \rightarrow (2, 2) \rightarrow (2, 3)(1,1)→(2,2)→(2,3).
In the second test case, one of the possible paths is (1, 1) \rightarrow (1, 2) \rightarrow (2, 3) \rightarrow (2, 4)(1,1)→(1,2)→(2,3)→(2,4).
In the fourth test case, one of the possible paths is (1, 1) \rightarrow (2, 2) \rightarrow (1, 3) \rightarrow (2, 4) \rightarrow (1, 5) \rightarrow (2, 6)(1,1)→(2,2)→(1,3)→(2,4)→(1,5)→(2,6).
这题一开始我用固有的思路,也就是深搜写完了,但发现超时之后认真思考了一下,发现此题的特殊之处在于只有两行,所以仔细思索不难发现只要同一列都有两个障碍就不成立,反之则成立。
那么此题的代码就很简单了
#include<bits/stdc++.h> using namespace std; int a[2][101]; bool flag[2][101]; int dx[]={0,0,-1,1,-1,1,-1,1}; int dy[]={1,-1,0,0,1,-1,-1,1}; int n; int dfs(int x,int y) { int xx,yy; if (x==1&&y==n-1) return 1; for (int i=0;i<8;i++) { xx=x+dx[i]; yy=y+dy[i]; if (xx<0||xx>1||yy<0||yy>=n) continue; if (a[xx][yy]==0&&flag[xx][yy]==0) { flag[xx][yy]=1; return dfs(xx,yy); flag[xx][yy]=0; } } return 0; } int main() { int t; cin>>t; for (int i=1;i<=t;i++) { memset(flag,0,sizeof(flag)); memset(a,0,sizeof(a)); cin>>n; for (int m=0;m<2;m++) for (int j=0;j<n;j++) scanf("%1d",&a[m][j]); if(dfs(0,0)==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }

浙公网安备 33010602011771号