您的位置:首页 > 其它

深度优先搜索算法

2015-09-25 10:27 369 查看
基础题:

input:

n m

下面是n行m列的矩阵,由’ . ‘和’ X ‘组成,求由(1,1)到(n,m)的最短路径

#include<iostream>
using namespace std;
#define M 100
#define INF 10000000

// 定义四个方向,来寻找最短路径
int dir[4][2] = {0,1,
0,-1,
1,0,
-1,0};
char map[M][M];
int ans,step=0,a=0;
int n,m;

// suppose '.'means can walk
//          'X'means cannot walk
// 判断x,y和map[x][y]
bool judge(int x, int y)
{
if(x>=0 && x<n && y>=0 && y<n && map[x][y]=='.')
return 1;
return 0;
}

void dfs(int x, int y, int step) // cal the min step
{
if(x==n && y==m-1)
{
if(step < ans)
ans = step;
}
// 每次循环都从四个方向上来寻找最短路径
for(int i=0; i<4; i++)
{
int tx = x+dir[i][0];
int ty = y+dir[i][1];
if(judge(tx,ty))
{
step++;
map[tx][ty]='x';
dfs(tx,ty,step);
step--;
map[tx][ty]='.';
}
}
}
int main()
{
while(cin>>n>>m&&m&&n)
{
ans = INF;
step = 0;
a = 0;
for(int i=0; i<n; i++)
{
getchar();
for(int j=0; j<m; j++)
{
scanf("%c", &map[i][j]);
if(map[i][j]=='.')
a++;
}
}
dfs(0,0,0);
if(ans!=INF)
cout << ans << endl;
else
cout << "Cannot achieve" << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息