下面是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中任意乙個,...