質問の意味:
マップがあり、左上のマップは玄関、輸出のための右下隅です。地図、1が0に行くことができ、歩くことができません。その輸入を確保するために、輸出はゼロ。最短ルートの出口の入り口を見つけるためのプログラムを書きます。
入力:
入力は、5×5の2次元アレイ、ちょうど2つの数字0,1、図中の表現位置です。
入力サンプル:
0 1 0 0 0
0 0 1 1 0
0 0 1 1 0
0 0 0 1 0
0 0 1 1 0
出力:
出力線に複数の、右座標を低下させる左上から最短経路を順次通過表します。データは独自のソリューションを持っていることを確認してください。
サンプル出力:
(0,0)
(1,0)
(2,0)
(3,0)
(3 ,. 1)
(3,2)
(2,2)
(1,2)
(0,2)
(0 、3)
(0,4)
(1,4)
(2,4)
(3,4)
(4,4)
アイデア:
マップはマップが場所に到達するために0マップと、障害物を示すが、まだ到着していないと、5 * 5の配列に初期化されます。開始幅優先探索(BFS)から、タグ2を起動し、すなわち(経路長をマーキングデジタル> 2を使用するので、番号0から使用されてきた、出発点は点の周りに到達することができる3、この標識など)、検索が遭遇したの出口を停止します。最後に、記録マークのパスからの出口に応じて、あなたが開始点に戻るまで、最短経路を見つける(各ポイントの現在のポイントよりも小さな経路長を記録するために見ています)。
コード:
#include <iostream>
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
const int maxn=5;
int vis[maxn][maxn];
int dx[]={1,-1,0,0},
dy[]={0,0,1,-1};
int sx=0,sy=0,tx=4,ty=4;
struct Point{
int x;
int y;
Point(int thex,int they)
{
x=thex,y=they;
}
};
queue<Point> q;
void bfs()
{
q.push(Point(sx,sy));
vis[sx][sy]=2;
while(!q.empty())
{
Point now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=now.x+dx[i];
int y=now.y+dy[i];
if(x>=0&&x<maxn&&y>=0&&y<maxn&&vis[x][y]==0)
{
vis[x][y]=vis[now.x][now.y]+1;
q.push(Point(x,y));
if(x==tx&&y==ty)
return;
}
}
}
}
void print()
{
vector<Point> v;
Point now(tx,ty);
v.push_back(Point(tx,ty));
while(true)
{
if(now.x==sx&&now.y==sy)
{
//printf("(%d,%d)\n",sx,sy);
break;
}
for(int i=0;i<4;i++)
{
int x=now.x+dx[i],y=now.y+dy[i];
if(x>=0&&x<maxn&&y>=0&&y<maxn&&vis[x][y]==vis[now.x][now.y]-1)
{
v.push_back(Point(x,y));
now.x=x,now.y=y;
break;
}
}
}
vector<Point>::reverse_iterator it=v.rbegin();
printf("(%d, %d)",it->x,it->y);
it++;
for(;it!=v.rend();it++)
printf("\n(%d, %d)",it->x,it->y);
}
int main(int argc, char** argv) {
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
cin>>vis[i][j];
bfs();
print();
return 0;
}