1. 程式人生 > >NYoj最少步數(DFS)

NYoj最少步數(DFS)

描述
這有一個迷宮,有0~8行和0~8列:

1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1

0表示道路,1表示牆。

現在輸入一個道路的座標作為起點,再如輸入一個道路的座標作為終點,問最少走幾步才能從起點到達終點?

(注:一步是指從一座標點走到其上下左右相鄰座標點,如:從(3,1)到(4,1)。)

輸入
第一行輸入一個整數n(0<n<=100),表示有n組測試資料;
隨後n行,每行有四個整數a,b,c,d(0<=a,b,c,d<=8)分別表示起點的行、列,終點的行、列。
輸出
輸出最少走幾步。
樣例輸入
2
3 1 5 7
3 1 6 7
樣例輸出
12

11

思路:DFS,對錶進行深搜,給你初始位置還有結束位置,直接查詢就行,注意這道題最好不要用vis儲存路徑,直接對map改改成牆就行,每一個DFS後要還原路徑map=0.

程式碼:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#define MAXN 10000
using namespace std;
int map[9][9]={{1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,1,0,1},{1,0,0,1,1,0,0,0,1},{1,0,1,0,1,1,0,1,1},{1,0,0,0,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1,1}};
int mi;
int x1,y1,x2,y2;
void dfs(int x1,int y1,int ans)
{
	if(map[x1][y1])
	return ;
	ans++;
	if(x1==x2&&y1==y2)
	{
		if(ans<mi)
		mi=ans;
		return ;
	}
	map[x1][y1]=1;
	dfs(x1,y1+1,ans);
	dfs(x1,y1-1,ans);
	dfs(x1+1,y1,ans);
	dfs(x1-1,y1,ans);
	map[x1][y1]=0;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
		int ans=0;
		mi=MAXN;
		dfs(x1,y1,ans);
		printf("%d\n",mi-1);
	}
}