【题目描述】
大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)Ki(0≤=Ki≤=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5
代表了Ki(K1=3,K2=3,……)Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到44楼,按“下”是不起作用的,因为没有−2−2楼。那么,从AA楼到BB楼至少要按几次按钮呢?
【输入】
共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200,1≤A,B≤N)N,A,B(1≤N≤200,1≤A,B≤N),第二行为NN个用空格隔开的正整数,表示KiKi。
【输出】
一行,即最少按键次数,若无法到达,则输出−1−1。
【输入样例】
5 1 5
3 3 1 2 5
【输出样例】
3
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define N 11
using namespace std;
int a[N][N];
int vis[N][N];
int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
int cnt = 0;
struct node {
int x;
int y;
}q[200];
void bfs(int x0, int y0)
{
a[x0][y0] = 1;
vis[x0][y0] = 1;
int head = 1, tail = 1;
q[tail].x = x0;
q[tail].y = y0;
tail++;
while (head < tail)
{
int x = q[head].x;
int y = q[head].y;
for (int i = 0; i < 4; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (1 <= nx && nx <= 10 && 1 <= ny && ny <= 10 && a[nx][ny] == 0 && vis[nx][ny] == 0)
{
vis[nx][ny] = 1;
a[nx][ny] = 1;
q[tail].x = nx;
q[tail].y = ny;
tail++;
}
}
head++;
}
}
void bfs_cnt(int x0, int y0)
{
vis[x0][y0] = 1;
cnt++;
int head = 1, tail = 1;
q[tail].x = x0;
q[tail].y = y0;
tail++;
while (head < tail)
{
int x = q[head].x;
int y = q[head].y;
for (int i = 0; i < 4; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (1 <= nx && nx <= 10 && 1 <= ny && ny <= 10 && a[nx][ny] == 0 && vis[nx][ny] == 0)
{
vis[nx][ny] = 1;
q[tail].x = nx;
q[tail].y = ny;
tail++;
cnt++;
}
}
head++;
}
}
int main()
{
for (int i = 1; i <= 10; i++)
for (int j = 1; j <= 10; j++)
cin >> a[i][j];
for (int j = 1; j <= 10; j++)
if (a[1][j] == 0)
bfs(1, j);
for (int j = 1; j <= 10; j++)
if (a[10][j] == 0)
bfs(10, j);
for (int i = 1; i <= 10; i++)
if (a[1][i] == 0)
bfs(1, i);
for (int i = 1; i <= 10; i++)
if (a[10][i] == 0)
bfs(10, i);
for (int i = 1; i <= 10; i++)
for (int j = 1; j <= 10; j++)
if (a[i][j] == 0 && vis[i][j] == 0)
bfs_cnt(i, j);
cout << cnt << endl;
return 0;
}