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";
}
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号