1. 程式人生 > >《啊哈!演算法》之解救小哈——深度優先演算法(C++)

《啊哈!演算法》之解救小哈——深度優先演算法(C++)

《啊哈!演算法之解救小哈》

題目:

我們需要用dfs()函式處理的問題是:先檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方

  1. 判斷是否已經到達小哈的位置
    if((x == endx) && (y == endy))
    {
        if(step < minute)
            minute = step;
        return ;
    }
  1. 找到下一步可以走的地方
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; }