啊,被SPFA折磨死了
调了半天的程序痿掉了
一开始发现visit数组开成了int
然后某一个循环多了1
然后入队出队的指针也错了
啊,现在打代码真是江硬
对了,忘了说思路了
就是随便找一个X点
然后向下面做一个射线
然后直接跑最短路就可以了
做一个射线的话可以防止在最短路的时候被重复更新
下面是代码,有人帮我调试一下吗?
真是*了敦了
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int dx[]={0,0,-1,1,1,-1,1,-1};
const int dy[]={1,-1,0,0,-1,1,1,-1};
int r,c,si,sj,qii,qij;
char m[60][60];
bool visit[52][52];
int dis[52][52];
int ans;
struct diandui{
int x,y;
};
inline void spfa(){
diandui q[100003];
dis[si][sj]=0;
int t=1,s=0;
q[s].x=si;q[s].y=sj;
visit[si][sj]=true;
while(s!=t){
int xx=q[s].x;
int yy=q[s].y;
s++;
visit[xx][yy]=false;
for(int i=0;i<=7;i++){
int xxx=xx+dx[i];
int yyy=yy+dy[i];
if(xxx>=1&&xxx<=r&&yyy>=1&&yyy<=c&&m[xxx][yyy]!='X'){
if(dis[xx][yy]+1<dis[xxx][yyy]){
dis[xxx][yyy]=dis[xx][yy]+1;
if(visit[xxx][yyy]==false){
visit[xxx][yyy]=true;
q[t].x=xxx;
q[t].y=yyy;
t++;
}
}
}
}
}
}
int main(){
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>m[i][j];
if(m[i][j]=='X'){
qii=i;
qij=j;
}
if(m[i][j]=='*'){
si=i;sj=j;
}
dis[i][j]=999;
}
}
while(m[qii][qij]=='X'){
qii++;
}
for(int k=qii;k<=c;k++){
m[k][qij]='X';
}
spfa();
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cout<<dis[i][j]<<" ";
}
cout<<endl;
}
int ans=999999999;
for(int i=qii-1;i<=r;i++){
ans=min(ans,dis[i][qij-1]+dis[i-2][qij+1]+2);
ans=min(ans,dis[i][qij-1]+dis[i-1][qij+1]+2);
ans=min(ans,dis[i][qij-1]+dis[i][qij+1]+2);
ans=min(ans,dis[i][qij-1]+dis[i+1][qij+1]+2);
ans=min(ans,dis[i][qij-1]+dis[i+2][qij+1]+2);
}
cout<<ans<<endl;
return 0;
}
/*
in:
6 7
.......
...X...
..XXX..
...XXX.
...X...
......*
out:
13
*/