2017.02.24:算法01(深搜)

深搜的代碼形式:

/*

void dfs(int step){
	判斷邊界
	嘗試每一種可能 for(i=1;i<=m;i++){
		繼續下一步 dfs(step+1);
	}
	返回
}

*/

例題如下:

 #include<stdio.h>
 
 int n,m,p,q,min=999999;
 int a[51][51],book[51][51];
 
 void dfs(int x, int y, int step){
	 int next[4][2] = {{0,1},                           //向右走
					   {1,0},                           //向下走
					   {0,-1},                          //向左走
					   {-1,0}};                         //向上走
	int tx, ty ,k;
	//判斷是否達到終點
	if(x==p && y==q){
		//更新最小值
		if(step<min)
			min=step;
		return; //結束迭代
	}
	//枚舉四種走法
	for(k=0;k<=3;k++){
		//計算下一個點的座標
		tx = x + next[k][0];
		ty = y + next[k][1];
	//判斷是否越界
	if(tx<1 || tx>n || ty<1 || ty>m)
		continue;
	//判斷是否爲障礙物或者已途徑過
	if(a[tx][ty]==0 && book[tx][ty]==0){
		book[tx][ty]=1;                                  //標記這個點
		dfs(tx,ty,step+1);                               //嘗試下一個點
		book[tx][ty]=0;                                  //嘗試結束,取消這個點
	}
	return;
 }
 
 itn main(){
	 int i,j,startx,starty;
	 scanf("%d %d",&n,&m);
	 for(i=1;i<=n;i++)
		 for(j=1;j<=m;j++)
			 scanf("%d".&a[i][j]);
	scanf("%d %d %d %d",&startx, &starty,&p,&q);
	book[startx][starty]=1;
	dfs(startx,starty,0);
	
	printf("%d",min);
	return 0;
 }

                                            /************************************/
											/*			輸入樣例:          	*/
											/*			5	4          			*/
											/*			0 0 1 0          		*/
											/*			0 0 0 0          		*/
											/*			0 0 1 0          		*/
											/*			0 0 1 0          		*/
											/*			0 1 0 0          		*/
											/*			0 0 0 1          		*/
											/*			1 1 4 3          		*/
											/************************************/
											/*	5表示迷宮的行,4表示迷宮的列	*/
											/*		0表示空地,1表示障礙物		*/
											/*(1,1表示起點),(4,3)表示終點	*/
											/************************************/
											/*			求解最短路徑			*/
											/************************************/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章