最少步数
时间限制:
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> #include<queue> #include<limits.h> using std::queue; 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 vis[9][9]; struct Node { int x,y; int step; }end,cur,next; int x_move[]={0,0,1,-1}; int y_move[]={1,-1,0,0}; bool judge() { if(next.x>=0&&next.x<9&&next.y>=0&&next.y<9&&!map[next.x][next.y]) return 1; return 0; } void BFS() { queue<Node>q; for(int i=0;i<9;i++) for(int j=0;j<9;j++) vis[i][j]=INT_MAX; while(!q.empty())q.pop(); //printf("%d\n",q.front().step); cur.step=0;//当前步数要初始化,否则会在上一次的基础上相加 next=cur; vis[cur.x][cur.y]=0;//记得将第一步初始化 for(int i=0;i<4;i++) { next=cur; next.x+=x_move[i]; next.y+=y_move[i]; if(vis[next.x][next.y]==INT_MAX&&!map[next.x][next.y]) { next.step++; vis[next.x][next.y]=next.step; q.push(next); } } while(!q.empty())//q.size();也可以 { cur=q.front(); // printf("%d ",cur.step); q.pop(); for(int i=0;i<4;i++) { next=cur; next.x+=x_move[i]; next.y+=y_move[i]; if(vis[next.x][next.y]==INT_MAX&&judge()) { next.step++; // if(vis[next.x][next.y]>next.step); vis[next.x][next.y]=next.step; //printf("%d ",vis[next.x][next.y]); q.push(next); } } } printf("%d\n",vis[end.x][end.y]); }; int main() { int N; scanf("%d",&N); while(N--) { scanf("%d%d%d%d",&cur.x,&cur.y,&end.x,&end.y); BFS(); /* for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { printf("%d ",a[i][j]); } printf("\n"); } */ } return 0; }
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;