最少步数
时间限制:
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,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
代码:
#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; }
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;