请大佬指教
  • 板块学术版
  • 楼主wangzl
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/2/26 11:47
  • 上次更新2023/11/5 02:41:16
查看原帖
请大佬指教
222039
wangzl楼主2021/2/26 11:47

为什么RE?

题目:龙&虫

题目描述

给出一张N*M的地图,在地图上有一只虫,样子却很像龙,而且嘴能快速地喷出一种毒液(直射),瞬间杀死敌人。 现在假设虫的初始位置在(X1,Y1),另外在(X2,Y2)处有一个敌人。假设虫移动一步需要单位1的时间,而杀死敌人不需要时间,并且虫的毒液射程无穷大,但毒液不能穿透阻碍物,虫只能攻击上、下、左、右、左上、右上、左下、右下八个方向。 请求出虫最少需要用多少时间才能消灭敌人。

输入 第一行为2个数N和M,表示矩阵的规模(N为高,M为宽)。 接下来是N*M的矩阵,O表示空地,X表示障碍物。 下面是若干行数据,每行为一对数据,分别是敌人的位置和虫的位置。显然,敌人和虫都不可能在障碍物上。 以“0 0 0 0”为输入结束标志。

输出 输出第一行为虫能消灭掉敌人的最短时间。 显然,若能直接打到敌人,则时间为0;若无法消灭,则第二行再输出“Impossible!”。

样例输入

3 4 OXXO XXOO XOOO 3 2 2 4 3 3 1 1 0 0 0 0 样例输出 1 Impossible!

提示

【数据规模】 对于30%的数据满足:NM<=5000。 对于50%的数据满足:NM<=10000。 对于100%的数据满足:N*M<=20000。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<queue>
#include<set>
#include<iomanip>
#include<vector>
#include<algorithm>
using namespace std;
const int N=20000+5;
const int dx[9]={0,1,0,-1,0,-1,1,-1,1};
const int dy[9]={0,0,1,0,-1,1,1,-1,-1};
int n,m,quickly,xc,yc,xd,yd;
bool meet[N][N];
char map[N][N];
struct Node{
	int  x,y,d;
	Node(int x,int y,int d):x(x),y(y),d(d){}
};
void visit_now(){
	for(int i=1;i<=n&&map[i][yc]=='O';++i)
	meet[i][yc]=true;
	for(int i=1;i<=m&&map[xc][i]=='O';++i)
	meet[xc][i]=true;
	for(int i=0;xc-i>=1&&yc-i>=1&&map[xc-i][yc-i]=='O';++i)
	meet[xc-i][yc-i]=true;
	for(int i=1;xc+i<=n&&yc+i<=m&&map[xc+i][yc+i]=='O';++i)
	meet[xc+i][yc+i]=true;
	for(int i=1;xc-i>=1&&yc+i<=m&&map[xc-i][yc+i]=='O';++i)
	meet[xc-i][yc+i]=true;
	for(int i=1;xc+i<=n&&yc-i>=1&&map[xc+i][yc-i]=='O';++i)
	meet[xc+i][yc-i]=true;
	/*
	for(int i=1;i<=n&&map[i][yd]=='O';++i)
	meet[i][yd]=true;
	for(int i=1;i<=m&&map[xd][i]=='O';++i)
	meet[xd][i]=true;
	for(int i=0;xd-i>=1&&yd-i>=1&&map[xd-i][yd-i]=='O';++i)
	meet[xd-i][yd-i]=true;
	for(int i=1;xd+i<=n&&yd+i<=m&&map[xd+i][yd+i]=='O';++i)
	meet[xd+i][yd+i]=true;
	for(int i=1;xd-i>=1&&yd+i<=m&&map[xd-i][yd+i]=='O';++i)
	meet[xd-i][yd+i]=true;
	for(int i=1;xd+i<=n&&yd-i>=1&&map[xd+i][yd-i]=='O';++i)
	meet[xd+i][yd-i]=true;
	*/
}
int bfs(){
	queue<Node>q;
	q.push(Node(xd,yd,0));
	while(!q.empty()){
		Node u=q.front();
		q.pop();
		if(meet[u.x][u.y]==true) return u.d;
		for(int i=1;i<=8;++i){
			int nx=u.x+dx[i];
			int ny=u.y+dy[i];
			if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&map[nx][ny]=='O'){
				q.push(Node(nx,ny,u.d+1));
			}
		}
	}
	return -1;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	for(int j=1;j<=m;++j)
	cin>>map[i][j];
	while(1){
		scanf("%d%d%d%d",&xc,&yc,&xd,&yd);
		if(!xc&&!yc&&!xd&&!yd) return 0;
		for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
		meet[i][j]=false;
		visit_now();
		quickly=bfs();
		quickly!=-1?printf("%d\n",quickly):printf("Impossible!\n");
	}
	return 0;
	
}


求RE的原因。

2021/2/26 11:47
加载中...