当前位置: 代码迷 >> 综合 >> NYOJ 58 最小步数(BFS DFS)
  详细解决方案

NYOJ 58 最小步数(BFS DFS)

热度:19   发布时间:2023-10-13 22:35:43.0

最少步数

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述

这有一个迷宫,有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<stdio.h>
#include<string.h>
#define INF 0x3f3f3f;
int x,y,ex,ey,min;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
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 dfs(int x,int y,int c)
{if(x==ex&&y==ey){if(c<min){min=c;}}else{for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(map[nx][ny]==0&&c+1<min){map[nx][ny]=1;dfs(nx,ny,c+1);map[nx][ny]=0;}}}
}
int main()
{int t;scanf("%d",&t);while(t--){int c=0;scanf("%d%d%d%d",&x,&y,&ex,&ey);min=INF;map[x][y]=1;dfs(x,y,c);map[x][y]=0;printf("%d\n",min);}return 0;
}
</pre></dd><dd style="margin:0px; padding:0px"><pre code_snippet_id="1792451" snippet_file_name="blog_20160729_3_5224033" name="code" class="cpp">BFS
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int x,y,ex,ey;
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 dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
bool vis[9][9];//标记数组,不可用map[x][y]=1,来标记,会出错; 
struct node
{int x,y,step;
};
int bfs()
{node s;s.x=x,s.y=y,s.step=0;vis[x][y]=true;queue<node>q;q.push(s);while(!q.empty()){node now=q.front();q.pop();if(now.x==ex&&now.y==ey){return now.step;//入队列有先后顺序,先找到终点的就是最小的步数,可直接输出step;}for(int i=0;i<4;i++){node end;end.x=now.x+dx[i];end.y=now.y+dy[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+=1;//能走则加一步,并标记  入队列;q.push(end);}}}
}
int main()
{int t;scanf("%d",&t);while(t--){memset(vis,false,sizeof(vis));//每次更新; scanf("%d%d%d%d",&x,&y,&ex,&ey);int ans=bfs();printf("%d\n",ans);}return 0;
}


 
     
 
    
  相关解决方案