1359 围成面积

【题目描述】

大楼的每一层楼都可以停电梯,而且第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;
}

おすすめ

転載: blog.csdn.net/QinZhen20100224/article/details/121888358