Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 36 Submission Accepted: 9
Total Submission: 36 Submission Accepted: 9
Description
由M行N列的方格构成一个迷宫,相邻方格之间可能是相通的,也可能有隔墙,各方格位置由对应坐标确定。在(1,1)处由入口,在(M,N)处有一个出口,在入口和出口之间有路相通,求从入口到出口的最短路径,若无法到达,输出“-1”
Input
第1行有两个整数,M,N(2<=M,N<=10), 接下来是M*N的0,1矩阵 0表示通路,1表示墙(数据保证入口和出口为通路)。
Output
输出最短路径
Sample Input
Original | Transformed |
6 8 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0
6[SP]8[EOL] 0[SP][SP]0[SP][SP]1[SP][SP]0[SP][SP]0[SP][SP]0[SP][SP]1[SP][SP]1[EOL] 1[SP][SP]0[SP][SP]0[SP][SP]0[SP][SP]1[SP][SP]0[SP][SP]0[SP][SP]0[EOL] 0[SP][SP]0[SP][SP]0[SP][SP]1[SP][SP]1[SP][SP]0[SP][SP]1[SP][SP]1[EOL] 1[SP][SP]1[SP][SP]0[SP][SP]1[SP][SP]0[SP][SP]0[SP][SP]0[SP][SP]0[SP][EOL] 0[SP][SP]0[SP][SP]0[SP][SP]0[SP][SP]0[SP][SP]1[SP][SP]0[SP][SP]1[EOL] 1[SP][SP]0[SP][SP]1[SP][SP]0[SP][SP]0[SP][SP]0[SP][SP]0[SP][SP]0[EOF]
Sample Output
Original | Transformed |
12
12[EOL] [EOF]
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
//#define DEBUG
using namespace std;
const int maxn = 15;
int map[maxn][maxn];
int dis[maxn][maxn];
bool flag[maxn][maxn];
bool result;
int dir[][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
int main() {
#ifdef DEBUG
freopen("Text.txt", "r", stdin);
#endif // DEBUG
int n, m;
while (cin >> n >> m) {
queue< pair<int, int> >q;
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
cin >> map[i][j];
memset(flag, 0, sizeof(flag));
memset(dis, 0, sizeof(dis));
q.push(pair<int, int>(1, 1));
flag[1][1] = 1;
dis[1][1] = 0;
result = 0;
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
if (x == n&&y == m) {
result = 1;
break;
}
for (i = 0; i < 4; i++) {
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if (xx <= n&&xx > 0 && yy <= m&& yy > 0&& !flag[xx][yy]&&!map[xx][yy]) {
q.push(pair<int, int>(xx, yy));
dis[xx][yy] = dis[x][y] + 1;
flag[xx][yy] = 1;
}
}
}
if (result)
cout << dis[n][m] << endl;
else
cout << -1 << endl;
}
return 0;
}