P8854

[POI2002]超级马

题目描述

在一个大小为无限的棋盘上有一个超级马,它可以完成各种动作。

每一种动作包含两个整数,第一个数说明上下移动的数,第二个数说明左右移动的数,移动马来完成这个动作。(数字均为正数向右,负数向左)

请你对每一个输入的超级马进行确认,看它是否可以到达棋盘上的每一个地方。

输入格式

第一行中存在一个整数 \(K\),表示数据组数。

对于每一组数据,第一行一个数 \(N\),表示超级马能完成的动作个数。

接下来 \(N\) 行,每一个行中包含两个整数 \(P\)\(Q\),表示这个动作。

输出格式

输出 \(N\) 行,判断超级马是否可以到达棋盘所有地方,可以输出 TAK,否则输出 NIE

样例 #1

样例输入 #1

2
3
1 0
0 1
-2 -1
5
3 4
-3 -6
2 -2
5 6
-1 4

样例输出 #1

TAK
NIE

提示

数据范围:\(1 \le K,N \le 100,-100 \le P,Q \le 100\)

不是很难的一道题 但是一堆RE是什么鬼????
先不管这些 说说思路
由于棋盘是无限大 所以判断能否走到每个位置只用判断能否走
(x-1,y) (x+1,y) (x,y-1) (x,y+1)即可
所以BFS 记录vis数组 判断即可
但是谜之RE就离谱(真就量子态呗)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int t,n,dx[105],dy[105],vis[305][305],flag;
struct did{
	int x,y;
}q[450005];
void bfs()
{
	int s=1,t=1;
	q[s].x=105,q[s].y=105;
	vis[105][105]=1;
	while(s<=t)
	{
		int x=q[s].x,y=q[s].y;
		if(vis[104][105]&&vis[105][104]&&vis[105][106]&&vis[106][105])
		{
			flag=1;
			return ;
		}
		for(int i=1;i<=n;i++)
		{
			int nx=x+dx[i],ny=y+dy[i];
			if(!vis[nx][ny]&&nx>0&&ny>0&&nx<207&&ny<207)
			{
				vis[nx][ny]=1;
				t++;
				q[t].x=nx,q[t].y=ny;
				if(vis[104][105]&&vis[105][104]&&vis[105][106]&&vis[106][105])
				{
					flag=1;
					return ;
				}
			}
		}
		s++;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>t;
	while(t--)
	{
		memset(vis,0,sizeof(vis));
		
		flag=0;
		cin>>n;
		for(int i=1;i<=n;i++)cin>>dx[i]>>dy[i];
		bfs();
		if(!flag)cout<<"NIE\n";
		else cout<<"TAK\n";
	}
}
posted @ 2023-01-11 16:44  PKU_IMCOMING  阅读(36)  评论(0)    收藏  举报