专题一搜索 C - Computer Game

  1. 题目

    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.

    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) and (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)→(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).

  2. 思路
    比B题那个跳马样板题还简单,设置5个方向搜就完了
    此外还有个简便方法:某一列两个都是1那么必定不能跳过去,除此之外都行
  3. 代码
    #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;
    }
    

      


posted @ 2022-01-23 21:30  Benincasa  阅读(133)  评论(0)    收藏  举报