40求助,感觉自己没什么问题啊
查看原帖
40求助,感觉自己没什么问题啊
367869
zhiyuantu楼主2020/11/17 20:51
#include<bits/stdc++.h>
using namespace std;
int move[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int z,h;
struct step{
	int n,m,dis;
};
//void sign(int a,int b,int x,int y)
//{
//	int xx=a+x,yy=b+y;
//	if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')return ;
//	sight[xx][yy]=1;
//	sign(xx,yy,x,y);
//}
int main()
{
	cin>>z>>h;
	char d[z+5][h+5];
	int vis[z+5][h+5];
	int sight[z+5][h+5];
	for(int i=1;i<=z;++i)
		for(int j=1;j<=h;++j)
			cin>>d[i][j];
	int a,b,sa,sb;
	while(cin>>sa>>sb>>a>>b)
	{
		if(a==0&&b==0&&sa==0&&sb==0)return 0;
		int flag=1,flag2=0;
		memset(vis,0,sizeof(vis));
		memset(sight,0,sizeof(sight));
		for(int i=sa;i>=1;--i){if(d[i][sb]=='X')break;else sight[i][sb]==1;}
		for(int i=sb;i<=h;++i){if(d[sa][i]=='X')break;else sight[sa][i]==1;}
		for(int i=sa;i<=z;++i){if(d[i][sb]=='X')break;else sight[i][sb]==1;}
		for(int i=sb;i>=1;--i){if(d[sa][i]=='X')break;else sight[sa][i]==1;}
		//sign(sa,sb,1,-1);sign(sa,sb,1,1);sign(sa,sb,-1,1);sign(sa,sb,-1,-1);
		int x=1,y=-1;
		int aa=sa,bb=sb;
		while(1){
			int xx=aa+x,yy=bb+y;
			if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
			sight[xx][yy]=1;
			aa=xx,bb=yy;
		}
		x=1,y=1;
		aa=sa,bb=sb;
		while(1){
			int xx=aa+x,yy=bb+y;
			if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
			else sight[xx][yy]=1;
			aa=xx,bb=yy;
		}
		x=-1,y=-1;
	    aa=sa,bb=sb;
		while(1){
			int xx=aa+x,yy=bb+y;
			if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
			else sight[xx][yy]=1;
			aa=xx,bb=yy;
		}
		x=-1,y=1;
		aa=sa,bb=sb;
		while(1){
			int xx=aa+x,yy=bb+y;
			if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
			else sight[xx][yy]=1;
			aa=xx,bb=yy;
		}
		if(sight[a][b]==1){
			cout<<0<<endl;
			continue;
		}
		step c;  c.n=a,c.m=b,c.dis=0;
		queue<step> q;
		q.push(c);vis[a][b]=1;
		while(!q.empty())
		{
			step k=q.front();q.pop();
			for(int i=0;i<4;++i)
			{	step next;
				next.n=k.n+move[i][0];
				next.m=k.m+move[i][1];
				next.dis=k.dis+1;
				if(next.n>z||next.m>h||next.n<1||next.m<1||vis[next.n][next.m]==1||d[next.n][next.m]=='X')continue;
				if(sight[next.n][next.m]==1){cout<<next.dis<<endl;flag=0;break;}
				vis[next.n][next.m]=1;
				q.push(next);
			}
			if(flag==0)break;
		}
		if(flag==1)cout<<"Poor Harry"<<endl;
		
	}
	return 0;
}
2020/11/17 20:51
加载中...