题目:龙&虫
题目描述
给出一张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的原因。