【求助】bfs中的后退
  • 板块灌水区
  • 楼主CuSO4_and_5H2O
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/4/17 10:11
  • 上次更新2023/10/28 03:31:10
查看原帖
【求助】bfs中的后退
231946
CuSO4_and_5H2O楼主2022/4/17 10:11

题目在这

本蒟蒻看这个题三小时了,三个小时不断缝缝补补终于改到90分了,然后剩下的十分下载数据之后没看出来为什么会出错,然后我就删了不让机器人往后退的语句,发现对了!,删之前是-1删之后就对,我百思不得其解,为什么能往后退就对呢

20 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
19 4 15 17 E
这是那个数据

我的代码就不必要了吧,思路就是BFS,删后退之前90(还是贴上去,但我感觉没人看我的丑代码

第29行if里最后一个是不让他往后退的,删了就对

#include<bits/stdc++.h>
using namespace std;
long long n,m,Map[101][101],kx,ky,jx,jy,map1[101][101];
char s;
int dx[8]={0,0,-1,0,1},
    dy[8]={0,-1,0,1,0},
    dxx[8]={0,1,2,3},
    dyy[8]={0,1,2,3};
queue<int> x,y,fx;
bool pd1(int X,int Y){
	if(X<1 || X>m || Y<1 || Y>n ||Y+1>n || X+1>m) return false;
	if(Map[X][Y]==1 || Map[X][Y+1]==1 || Map[X+1][Y]==1 || Map[X+1][Y+1]==1 ) return false;
	return true;
}
bool pd(int i,int j,int xx,int yy){
     	for(int k1=1;k1<=j;k1++)
     		if(!pd1(xx+dx[i]*k1,yy+dy[i]*k1))  return false;
     	return true;
}
void  bfs(int X,int Y){
	x.push(X);
	y.push(Y);
	map1[X][Y]=1;//别忘了减一 
	while(!x.empty()){
		for(int i=1;i<=4;i++){
	        for(int j=1;j<=3;j++){
	        	int xx=x.front()+dxx[j]*dx[i],
	        	    yy=y.front()+dyy[j]*dy[i];
	        	if(xx>=1 && xx<m && yy>=1 && yy<n && pd(i,j,x.front(),y.front())  && abs(fx.front()-i)!=2){
	        		int ful;
	        		if(i!=fx.front()) ful=1;
					else ful=0;  
	        		if(map1[xx][yy]==0 || (map1[xx][yy]>map1[x.front()][y.front()]+1+ful)){
	        		map1[xx][yy]=map1[x.front()][y.front()]+1+ful;
	        		x.push(xx);
	        		y.push(yy);
	        		fx.push(i);
					}
				}
			}
		}
		x.pop(),y.pop(),fx.pop();
	}
}


int main(){
  cin>>m>>n;
  for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
     cin>>Map[i][j];
  cin>>kx>>ky>>jx>>jy>>s;
  if(s=='W')  fx.push(1);
  if(s=='N')  fx.push(2);
  if(s=='E')  fx.push(3);
  if(s=='S')  fx.push(4);
  bfs(kx,ky);
  cout<<map1[jx][jy]-1;
}

这是我的第一个不看题解做得差不多的绿题

2022/4/17 10:11
加载中...