简单最短路(每一条边权值为1)
以下可以实现简单最短路权值为1,#是障碍,.是路。
普通版本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,dx[]={-1,1,0,0},dy[]={0,0,1,-1};
bool f[1004][1004],flag=false;
char c[1004][1004];
struct str{
int x,y,cut;
};
struct point{
int x,y;
}dist[1004][1004];
void print(point nn){
if(dist[nn.x][nn.y].x==0 && dist[nn.x][nn.y].y==0){
cout<<nn.x<<" "<<nn.y<<endl;
return ;
}
print(dist[nn.x][nn.y]);
cout<<nn.x<<" "<<nn.y<<endl;
return ;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
if(c[i][j]=='#') f[i][j]=true;
}
}
queue<str> q;
q.push({1,1,0});
dist[1][1]={0,0};
f[1][1]=true;
while(!q.empty()){
str nn=q.front();
q.pop();
if(nn.x==n && nn.y==m){
cout<<"找到了!"<<endl;
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<dist[i][j].x<<" "<<dist[i][j].y<<"好了";
}
cout<<endl;
}
*/
print({nn.x,nn.y});
flag=true;
break;
}
for(int i=0;i<4;i++){
int nx=nn.x+dx[i],ny=nn.y+dy[i];
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(c[nx][ny]=='#') continue;
if(f[nx][ny]) continue;
q.push({nx,ny,nn.cut+1});
f[nx][ny]=true;
dist[nx][ny]={nn.x,nn.y};
}
}
if(flag) cout<<"寻找完成!";
else cout<<"无法找到路径!";
return 0;
}
升级版本
#include<bits/stdc++.h>
#include<windows.h>
#define int long long
using namespace std;
int n,m,dx[]={-1,1,0,0},dy[]={0,0,1,-1};
bool f[1004][1004],flag=false;
char c[1004][1004];
struct str{
int x,y,cut;
};
struct point{
int x,y;
}dist[1004][1004];
void print(point nn){
if(dist[nn.x][nn.y].x==0 && dist[nn.x][nn.y].y==0){
cout<<nn.x<<" "<<nn.y<<endl;
Sleep(100);
return ;
}
print(dist[nn.x][nn.y]);
cout<<nn.x<<" "<<nn.y<<endl;
Sleep(100);
return ;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
if(c[i][j]=='#') f[i][j]=true;
}
}
if(f[1][1] || f[n][m]){
cout<<"无法找到路径!";
exit(0);
}
queue<str> q;
q.push({1,1,0});
dist[1][1]={0,0};
f[1][1]=true;
while(!q.empty()){
str nn=q.front();
q.pop();
if(nn.x==n && nn.y==m){
cout<<"找到了!"<<endl;
print({nn.x,nn.y});
flag=true;
break;
}
for(int i=0;i<4;i++){
int nx=nn.x+dx[i],ny=nn.y+dy[i];
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(c[nx][ny]=='#') continue;
if(f[nx][ny]) continue;
q.push({nx,ny,nn.cut+1});
f[nx][ny]=true;
dist[nx][ny]={nn.x,nn.y};
}
}
if(flag) cout<<"寻找完成!";
else cout<<"无法找到路径!";
return 0;
}