寒假ACM假期总结 (7)

1.

Monocarp正在玩电脑游戏。现在他想完成这个游戏的第一个关卡。
level是一个2行n列的矩形网格。Monocarp控制一个字符,该字符从单元格(1,1)开始,位于第1行和第1列的交点。
如果单果皮细胞相邻或相邻,单果皮的性状可以一步一步地从一个细胞移动到另一个细胞。形式上,如果|x1−x2|≤1和|y1−y2|≤1,则可以一步从单元格(x1,y1)移动到单元格(x2,y2)。很明显,禁止走出电网。
有些细胞中有陷阱。如果Monocarp的角色发现自己在这样一个牢房里,他就会死,游戏也就结束了。
要完成一个关卡,Monocarp的字符应该到达单元格(2,n) -在第2行和第n列的交叉处。
帮助Monocarp确定是否有可能完成关卡。

Input

输入
第一行包含一个整数t(1≤t≤100)-测试用例的数量。接下来是测试用例。每个测试用例由三行组成。 第一行包含单个整数n(3≤n≤100)—列数。
接下来的两行描述关卡。这些行中的第i行描述关卡的第i行——该行由字符“0”和“1”组成。字符'0'对应一个安全单元格,字符'1'对应一个陷阱单元格。
对输入的附加约束:单元格(1,1)和(2,n)是安全的。

Output

对于每个测试用例,如果能够完成关卡,则输出YES,否则输出NO。

Example

Input

4
3
000
000
4
0011
1100
4
0111
1110
6
010101
101010

Output

YES
YES
NO
YES

Note

考虑语句中的例子。
在第一个测试用例中,可能的路径之一是(1,1)→(2,2)→(2,3)。
在第二个测试用例中,可能的路径之一是(1,1)→(1,2)→(2,3)→(2,4)。
在第四个测试用例中,可能的路径之一是(1,1)→(2,2)→(1,3)→(2,4)→(1,5)→(2,6)。

思路:运用广搜

代码:

#include<stdio.h>
char a[200][200];
int x,y,m,flag,book[200][200];
void dfs()
{
	int tx,ty,k=0;
	int z[5][2]={{1,1},{0,1},{-1,1}};
	for(k=0;k<3;k++)
	{
		tx=x+z[k][0];
		ty=y+z[k][1];
    	if(tx<0||tx>1||ty<0||ty>m-1||a[tx][ty]=='1')
		continue;
    	if(a[tx][ty]=='0'&&book[tx][ty]==0)
		{
			x=tx;
			y=ty;
		if(tx==1&&ty==m-1)
		{
			flag=1;
			break;
		}
		else 
		dfs();
		}
	}
}
int main()
{
	int i,j,n;
	scanf("%d",&n);
	while(n--)
	{
	flag=0;
	scanf("%d",&m);
	for(i=0;i<2;i++)
	scanf("%s",a[i]);
	getchar();
    x=0,y=0;
	book[0][0]=1;
	dfs();
	if(flag==1)
	printf("YES\n");
	else
	printf("NO\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值