本蒟蒻看这个题三小时了,三个小时不断缝缝补补终于改到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;
}
这是我的第一个不看题解做得差不多的绿题