题目:
这有一个迷宫,有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)分别表示起点的行、列,终点的行、列。
输出
- 输出最少走几步。
思路1:就是用bfs+priority_queue;
思路2:dfs
下面是代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
using namespace std;
int num[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
};
struct node {
int x;
int y;
int step;
friend bool operator < (node b, node a) {
return b.step>a.step;
};
};
int dir_x[4]= {1,0,-1,0};
int dir_y[4]= {0,-1,0,1};
int a,b,c,d,len,minlen;
bool vis[9][9];
void bfs() {
priority_queue<node>q;
node p1,p2;
p1.x=a;
p1.y=b;
p1.step=0;
q.push(p1);
memset(vis,false,sizeof(vis));
vis[a][b]=true;
while(!q.empty()) {
p2=q.top();
q.pop();
if(p2.x==c&&p2.y==d) {
printf("%d\n",p2.step);
return;
}
for(int i=0; i<4; i++) {
p1.x=p2.x+dir_x[i];
p1.y=p2.y+dir_y[i];
p1.step=p2.step+1;
if(num[p1.x][p1.y]||vis[p1.x][p1.y]) {
continue;
}
q.push(p1);
vis[p1.x][p1.y]=true;
}
}
}
void dfs(int i,int j) {
if(len>=minlen) {
return;
}
if(i==c&&j==d) {
minlen=len;
return;
}
for(int k=0; k<4; k++) {
if(num[i+dir_x[k]][j+dir_y[k]]==0) {
num[i+dir_x[k]][j+dir_y[k]]=1;
++len;
dfs(i+dir_x[k],j+dir_y[k]);
--len;
num[i+dir_x[k]][j+dir_y[k]]=0;
}
}
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
cin>>a>>b>>c>>d;
//bfs();
minlen=82;
len=0;
dfs(a,b);
printf("%d\n",minlen);
}
return 0;
}