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 1x1x21 and |y_1 - y_2| \le 1y1y21. 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 1001t100) — 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 1003n100) — 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

Input
4
3
000
000
4
0011
1100
4
0111
1110
6
010101
101010
Output
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;
}

 

posted @ 2022-01-23 17:37  666dy  阅读(158)  评论(0)    收藏  举报