Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
Sample Input
33 32 1 11 1 04 81 1 32 1 1 0 1 1 1 01 0 4 1 1 0 4 11 1 1 4 1 1 1 31 0 0 0 0 0 0 15 81 0 0 0 1 0 0 11 2 1 1 1 1 1 4 1 4 1 0 1 1 0 11 1 4 1 1 1 1 11 0 0 0 0 3 0 1
Sample Output
4-113
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<queue> using namespace std; int n,m; int maze[10][10];//迷宫 int sx,sy;//起始坐标 //搜索方向 int dx[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; struct pp { int x,y; int cont; int move; }; void bfs() { queue<pp> que; pp cur; cur.x = sx; cur.y = sy; cur.cont = 6;//设置初始时间 cur.move = 0;//移动步数为0 que.push(cur);//将起点加入队列 maze[sx][sy] = 0;//标记,不再访问 while(que.size()) { cur = que.front(); que.pop(); pp next; for(int i = 0;i < 4;i++) //对四个方向进行搜索 { int nx = cur.x + dx[i][0]; int ny = cur.y + dx[i][1]; int nz = cur.cont; //判断是否可以移动以及是否被访问 if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] != 0) { if(maze[nx][ny] == 1)//若移动后的位置为1 { nz--; //判断在此位置的时间是否为0 if(nz >= 1) //若大于0,将步数在cur的基础上加1,入队 { next.x = nx; next.y = ny; next.cont = nz; next.move = cur.move + 1; que.push(next); } } if(maze[nx][ny] == 4)//若移动后的位置为4 { nz--;//判断在此位置的时间是否为0 if(nz >= 1)//若大于0,将时间重置为6,步数在cur的基础上加1,入队 { next.x = nx; next.y = ny; next.cont = 6; next.move = cur.move + 1; que.push(next); } maze[nx][ny] = 0;//标记,不再访问 } if(maze[nx][ny] == 3 && cur.cont > 1)//若到达终点且时间大于1,输出最小步数 { cur.move++; printf("%d\n",cur.move); return ; } } } } printf("-1\n");//若无法到达终点,输出-1 } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); for(int i = 0;i < n;i++) { for(int j = 0;j < m;j++) { scanf("%d",&maze[i][j]); if(maze[i][j] == 2)//记录起始位置 { sx = i; sy = j; } } } bfs(); } return 0; }