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; } }
世上无难事,只怕有心人!