定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
左上角到右下角的最短路径,格式如样例所示。
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
dfs 记录dfs路径
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <climits>
#include <ctime>
#include <complex>
#include <cmath>
#include <string>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 105
typedef pair<int,int> pii;
int mp[6][6];
pii ans[maxn];
pii tans[maxn];
bool vis[6][6];
int cnt;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
void dfs(int x,int y,int d){
if(x==4&&y==4){
if(d<cnt){
for(int i=0;i<d;i++){
ans[i]=tans[i];
}
cnt=d;
}
return;
}
for(int k=0;k<4;k++){
int tx=x+dx[k];
int ty=y+dy[k];
if(tx>=0&&tx<5&&ty>=0&&ty<5){
if(mp[tx][ty]==0&&!vis[tx][ty]){
tans[d].first=tx;
tans[d].second=ty;
vis[tx][ty]=true;
dfs(tx,ty,d+1);
vis[tx][ty]=false;
}
}
}
return;
}
int main(){
while(cin>>mp[0][0]){
cnt=INT_MAX;
memset(tans,0,sizeof(tans));
memset(ans,0,sizeof(ans));
for(int i=1;i<5;i++)
cin>>mp[0][i];
for(int i=1;i<5;i++)
for(int j=0;j<5;j++)
cin>>mp[i][j];
tans[0].first=0;
tans[0].second=0;
dfs(0,0,1);
for(int i=0;i<cnt;i++){
cout<<"("<<ans[i].first<<", "<<ans[i].second<<")\n";
}
}
return 0;
}