最少步数
时间限制:
3000 ms | 内存限制:
65535 KB
-
描述
-
这有一个迷宫,有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,10表示道路,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深度优先搜索
•访问起 始点v;•若 v的 第1个邻接点没访问过, 深度遍历此邻接点;•若当前邻接点已访问过,再找 v的第 2个邻接点重新遍历。
这道题比较特殊,直接将走过的路标记为墙就行了。简单的遍历,不过刚接触,还是有许多小技巧要熟悉的。额。。好吧,这道题用BFS也能做。。结构体是个神奇的玩意儿。。DFS代码:#include<stdio.h> #include<algorithm> using namespace std; int a,b,c,d,ans; 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 px[4]={-1,0,1,0};//模拟移动坐标 int py[4]={0,1,0,-1};//px,py要对应 void dfs(int a,int b,int sum){//sum为走的步数 if(a==c&&b==d) if(sum<ans) ans=sum;//ans记录最少步数 else{ for(int i=0;i<4;i++){ int x=a+px[i]; int y=b+py[i];//移动之后的坐标 if(map[x][y]==0&&sum+1<ans){//后一个判断是剪枝,减少运算量,避免超时 map[x][y]=1;//走过的路直接标记为墙 dfs(x,y,sum+1); map[x][y]=0;//走进死路,原路返回 } } } } int main(){ int n; scanf("%d",&n); while(n--){ int sum=0; scanf("%d%d%d%d",&a,&b,&c,&d); map[a][b]=1; ans=10000;//ans起始值为一个很大的数 dfs(a,b,sum); printf("%d\n",ans); map[a][b]=0;//测试之后将起点恢复原值 } return 0; }
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
BFS代码:
<span style="font-size:14px;">#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int m,n,ans,a,b,c,d,sum;
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,
};
bool vis[15][15];
struct node{
int x,y,step;
};
int px[4]={-1,0,1,0};
int py[4]={0,1,0,-1};
int bfs(){
node s;
s.x=a,s.y=b,s.step=0;
vis[a][b]=0;
queue<node> q;
q.push(s);
while(!q.empty()){//当队列非空时
node now=q.front();
q.pop();
if(now.x==c&&now.y==d)
return now.step;
for(int i=0;i<4;i++){
node end;
end.x=now.x+px[i];
end.y=now.y+py[i];
end.step=now.step;
if(map[end.x][end.y]==0&&!vis[end.x][end.y]){
vis[end.x][end.y]=true;
end.step++;
q.push(end);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(vis,false,sizeof(vis));
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("%d\n",bfs());
}
return 0;
}</span>