《啊哈!演算法》之解救小哈——深度優先演算法(C++)
阿新 • • 發佈:2019-02-12
《啊哈!演算法之解救小哈》
我們需要用dfs()函式處理的問題是:先檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方
- 判斷是否已經到達小哈的位置
if((x == endx) && (y == endy))
{
if(step < minute)
minute = step;
return ;
}
- 找到下一步可以走的地方
int next[4][2]={{1,0},
{0,1},
{0 ,-1},
{-1,0}};
for(int k=0;k<4;k++)
{
int kx=x+next[k][0];
int ky=y+next[k][1];
if((kx < 1) || (ky <1) || (kx > row) || (ky > col))
continue;
if((a[kx][ky] == 0) && (book[kx][ky] == 0))
{
book[kx][ky]=1 ;
dfs(kx,ky,step+1);
book[kx][ky]=0;
}
}
return ;
故整個程式為:
#include<iostream>
using namespace std;
int row=0,col=0,minute=99999;
int a[51][51],book[51][51];
int starty,startx=0;
int endx,endy=0;
void dfs(int x,int y,int step)
{
int next[4][2]={{1,0},
{0 ,1},
{0,-1},
{-1,0}};
if((x == endx) && (y == endy))
{
if(step < minute)
minute = step;
return ;
}
//four ways
for(int k=0;k<4;k++)
{
int kx=x+next[k][0];
int ky=y+next[k][1];
if((kx < 1) || (ky <1) || (kx > row) || (ky > col))
continue;
if((a[kx][ky] == 0) && (book[kx][ky] == 0))
{
book[kx][ky]=1;
dfs(kx,ky,step+1);
book[kx][ky]=0;
}
}
return ;
}
int main()
{
cout << "please input the row of the road: " ;
cin >> row;
cout << "please input the col of the road: ";
cin >>col;
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
cin >> a[i][j];
}
int sx,sy,ex,ey=0;
cout <<"please input the start x,y: " ;
cin >> startx >> starty;
cout << "please input the end x,y: ";
cin >> endx>> endy;
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
{
cout << a[i][j];
}
cout << endl;
}
book[startx][starty]=1;
dfs(startx,starty,0);
cout << minute;
return 0;
}