深度優先搜尋演算法

2022-08-20 10:09:13 字數 1824 閱讀 3001

下面是poj3009 curling2.0的題目。

使用的是dfs搜尋,**如下,從中可以體會到dfs搜尋的常規特點:

//poj3009 curling 2.0

//使用深度搜尋,這題有兩個地方需要注意:

//1、當球與箱子相鄰的時候,球無法滾動,也無法裝破箱子。

//2、題目有乙個限界,當球滾了10次還沒有進入目標點,看做不能到達。

#include#include#include#define __debug 0

using namespace std;

#define max 30

int map[max][max];

int dir[4][2]=,,,};

int row,column,step,minstep;

int find(int x,int y)

void dfs(int step,int x,int y)

if( map[nextx][nexty]==3)

}}

if(__debug)

int r=pos[n]/9; //在第r行

int c=pos[n]%9; //在第c列

int k= (r/3)*3+(c/3); //在第k個小方格

for(int i=1; i<=9 && !dfs_sudo;i++)

return;

}int main(),,,,,,,}; //the direction of the knight

int p,q; //記錄棋盤的x,y

int sign; //用來標記棋盤的所有空格都已經走完

int step; //記錄當前的步數

void dfs(int i,int j)

for(int k=0; k<8 ;k++) }

board[i][j]=0; //失敗,則對座標(i,j)清零,回溯

}int main(),}; //標記移動的方向,依次為:下、右、上、左(x座標,y座標)

int startx,starty; //記錄maze的起點座標

int lflag,lstep,rstep; //lflag變數標記執行left path或right path

struct node

};int bfs(int x,int y){ //bfs一般使用佇列的資料結構,並使用非遞迴形式

queueq;

node n=node(x,y,1);

q.push(n);

while( !q.empty()){

node tmp=q.front();

q.pop();

for( int k=0;k<4;k++){ //在四個方向上進行判斷

int nextx=tmp.x+dir[0][k]; //這裡是在前乙個結點的基礎上試探,所以使用的是tm.x/tmp.y,而不是x/y

int nexty=tmp.y+dir[1][k];

if( nextx>=0 && nextx=0 && nexty=0 && nextx=0 && nexty>count;

while(count--){ //count--,先判斷,後執行減運算

in>>width>>height;

for(int i=0;i>map[i];

//cout<

這道題目中,由於要求就出的是向左走和向右走為高優先順序的路徑,所以在方向的變換上要注意:向左走,就需要始終保持以左方向為高優先順序,這點是最重要的。

文章**出處:

深度優先搜尋演算法

include include define vertexnum 9 struct node typedef struct node graph struct node head vertexnum 定義圖形結構 int visited vertexnum 頂點陣列 深度優先搜尋 void dfs ...

深度優先搜尋演算法

今天我們來複習一下萬能的搜尋演算法之深度優先搜尋演算法。深度優先搜尋演算法顧名思義就是按照樹的延伸不停的往下搜尋,直到樹的盡頭之後再一步一步的回溯回來。好吧,我們直接問你乙個問題,給你乙個數n,讓你輸出從1到這個樹的全排列,你會怎麼寫,會不會想到去用若干個for迴圈?好吧,你肯定錯了,其實他考的就是...

深度優先搜尋演算法

1.深度優先搜尋演算法的概念 深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個 節點只能訪問一次。如下例 該圖為乙個無向圖,假設我們從a開始進行深度優先搜尋,第二點可以是b c d中任意乙個,...