50分 TLE+MLE ,求助洛谷的大佬们!
查看原帖
50分 TLE+MLE ,求助洛谷的大佬们!
558686
KinoTsuki楼主2022/6/2 13:30
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
const int N =4001;

struct Node{
	int x,y,stp;//队列元素
};
int m,n;
const int nx[4]={1,0,0,-1};//Henry的移动
const int ny[4]={0,1,-1,0};
const int nex[8]={1,1,1,0,-1,-1,-1,0};//视野
const int ney[8]={1,0,-1,-1,-1,0,1,1};

char a[N][N];//地图
bool b[N][N];//判断走过没有
bool c[N][N];//是否可以看到奖杯
int main() {
	//freopen("in.txt","r",stdin);
	scanf("%d%d",&m,&n);
	for(int i=0;i<m;i++) {
		scanf("%s",a[i]);//输入
	}
	int sx,sy,ex,ey;
	while(1) {
		bool flag=false;
		scanf("%d%d%d%d",&ex,&ey,&sx,&sy);ex--;ey--;sx--;sy--;//输入并换成0~n-1循环数(下标从0开始数)
		if(sx==-1) return 0;//判断是否输入完
		queue<Node> Q;while(!Q.empty()) Q.pop();//定义队列并初始化
		memset(b,false,sizeof(b));//初始化
		memset(c,false,sizeof(c));
		for(int pos=0;pos<8;pos++) {//以奖杯为中心,向8个方向搜
			c[ex][ey]=true;//标记为可以看到奖杯
			int x=ex , y=ey;
			while(a[x][y]!='X' && x>=0 && y>=0 && x<m && y<n ) {//这个方向一直可以看到
				c[x][y]=true;
				x+=nex[pos] , y+=ney[pos];//GO
			}
		}
		if(c[sx][sy]) {//特判起点就可以看到奖杯的情况
			printf("0\n");
			continue;
		}
		Node start={sx,sy,0};//插入起点,步数为0
		Q.push(start);
		while(!Q.empty()) {
			int x=Q.front().x , y=Q.front().y , stp=Q.front().stp;Q.pop();
			if(c[x][y]) {//可以看到奖杯
				printf("%d\n",stp);while(!Q.empty()) Q.pop();//清空队列
				flag=true;//标记输出过了
				continue;
			}
			b[x][y]=true;//标记走过
			for(int pos=0;pos<4;pos++) {//向四个方向走
				int tx=x+nx[pos] , ty=y+ny[pos];
				if(tx<0||ty<0||tx>=m||ty>=n||b[tx][ty]||a[tx][ty]=='X') continue;//判断是否可走
				Node next={tx,ty,stp+1};
				Q.push(next);//GO
			}
		}
		if(!flag) printf("Poor Harry\n");//不能走到
	}
	//fclose(stdin);
	return 0;
}

提交记录

2022/6/2 13:30
加载中...