专题一搜索 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 x1x21 and y1y21. 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 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) 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  阅读(103)  评论(0编辑  收藏  举报