nyoj 最少步数

算法:搜索(深度优先搜索)

描述
这有一个迷宫,有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
代码:

#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#define INF 1000000
using namespace std;
int a[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 b[8][8],c,d,l[4][2]={-1,0,0,-1,1,0,0,1};
void dfs(int i,int j)
{
	if(i==c&&j==d) return;
	for(int k=0;k<4;k++)
	{
		int dx=i+l[k][0];
		int dy=j+l[k][1];
		if(dx>=0&&dx<8&&dy>=0&&dy<8&&a[dx][dy]==0)
		{
			a[dx][dy]=1;
			if(b[i][j]+1<b[dx][dy]) b[dx][dy]=b[i][j]+1;
			dfs(dx,dy);
			a[dx][dy]=0;
		}
	}
}
int main()
{
	int t,i,j,k,n,m;
	cin>>t;
	while(t--)
	{
		cin>>n>>m>>c>>d;
		for(i=0;i<8;i++)
		for(j=0;j<8;j++)
		b[i][j]=INF;
		b[n][m]=0;
		dfs(n,m);
		cout<<b[c][d]<<endl;
	}
}


posted @ 2015-12-29 10:19  (慎独)  阅读(311)  评论(0编辑  收藏  举报