• CodeForces 1208 C. Text Editor BFS广搜


    C. Text Editor
    time limit per test 1 second
    memory limit per test 256 megabytes

    Vasya is pressing the keys on the keyboard reluctantly, squeezing out his ideas on the classical epos depicted in Homer's Odysseus... How can he explain to his literature teacher that he isn't going to become a writer? In fact, he is going to become a programmer. So, he would take great pleasure in writing a program, but none — in writing a composition.

    As Vasya was fishing for a sentence in the dark pond of his imagination, he suddenly wondered: what is the least number of times he should push a key to shift the cursor from one position to another one?

    Let's describe his question more formally: to type a text, Vasya is using the text editor. He has already written n lines, the i-th line contains ai characters (including spaces). If some line contains k characters, then this line overall contains (k + 1) positions where the cursor can stand: before some character or after all characters (at the end of the line). Thus, the cursor's position is determined by a pair of integers (r, c), where r is the number of the line and c is the cursor's position in the line (the positions are indexed starting from one from the beginning of the line).

    Vasya doesn't use the mouse to move the cursor. He uses keys "Up", "Down", "Right" and "Left". When he pushes each of these keys, the cursor shifts in the needed direction. Let's assume that before the corresponding key is pressed, the cursor was located in the position (r, c), then Vasya pushed key:

    • "Up": if the cursor was located in the first line (r = 1), then it does not move. Otherwise, it moves to the previous line (with numberr - 1), to the same position. At that, if the previous line was short, that is, the cursor couldn't occupy position c there, the cursor moves to the last position of the line with number r - 1;
    • "Down": if the cursor was located in the last line (r = n), then it does not move. Otherwise, it moves to the next line (with number r + 1), to the same position. At that, if the next line was short, that is, the cursor couldn't occupy position c there, the cursor moves to the last position of the line with number r + 1;
    • "Right": if the cursor can move to the right in this line (c < ar + 1), then it moves to the right (to position c + 1). Otherwise, it is located at the end of the line and doesn't move anywhere when Vasya presses the "Right" key;
    • "Left": if the cursor can move to the left in this line (c > 1), then it moves to the left (to position c - 1). Otherwise, it is located at the beginning of the line and doesn't move anywhere when Vasya presses the "Left" key.

    You've got the number of lines in the text file and the number of characters, written in each line of this file. Find the least number of times Vasya should push the keys, described above, to shift the cursor from position (r1, c1) to position (r2, c2).

    Input

    The first line of the input contains an integer n (1 ≤ n ≤ 100) — the number of lines in the file. The second line contains n integersa1, a2, ..., an (0 ≤ ai ≤ 105), separated by single spaces. The third line contains four integers r1, c1, r2, c2 (1 ≤ r1, r2 ≤ n, 1 ≤ c1 ≤ ar1 + 1, 1 ≤ c2 ≤ ar2 + 1).

    Output

    Print a single integer — the minimum number of times Vasya should push a key to move the cursor from position (r1, c1) to position(r2, c2).

    Sample test(s)
    input
    4
    2 1 6 4
    3 4 4 2
    output
    3
    input
    4
    10 5 6 4
    1 11 4 2
    output
    6
    input
    3
    10 1 10
    1 10 1 1
    output
    3
    Note

    In the first sample the editor contains four lines. Let's represent the cursor's possible positions in the line as numbers. Letter srepresents the cursor's initial position, letter t represents the last one. Then all possible positions of the cursor in the text editor are described by the following table.

    123

    12

    123s567

    1t345

    One of the possible answers in the given sample is: "Left", "Down", "Left".

     解题思路:100*10000的矩阵,BFS查找两点最短距离,注意次题上下移动特别的地方。

    解题代码:

    View Code
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    const int N = 100007;
    
    int n , m, Max;
    bool vis[101][N];
    int A[N];
    
    class node{
        public:
        int x, y, step;
        void read(){
            scanf("%d%d",&x,&y);
            step = 0;
        }
        bool operator == (node tmp) const
        {
            if( x == tmp.x && y == tmp.y )
                    return true;
            else    return false;    
        }
    }info,nxt, s,t; 
    queue<node> Q;
    int dir[4][2] = { {0,-1},{0,1},{-1,0},{1,0} };
    void bfs(){
        memset( vis, 0, sizeof(vis));
        while( !Q.empty() ) Q.pop();
        Q.push(s);
        vis[ s.x ][ s.y ] = true;
        while( !Q.empty() )
        {
            info = Q.front(); Q.pop();
            int x = info.x, y = info.y, step = info.step;
            if( info == t ){
                printf("%d\n", info.step);    
                return;
            }
            for(int i = 0; i < 4; i++)
            {
                    int xx = x+dir[i][0], yy = y+dir[i][1];
                    if( dir[i][0] == 0 ){
                            // left <-->right
                            if( yy <= A[xx] && yy >= 1 && !vis[xx][yy] )
                            {
                                vis[xx][yy] = true;
                                nxt.x = xx; nxt.y = yy; nxt.step = step+1;
                                Q.push(nxt);
                            }    
                    }
                    else{
                            // up <--> down
                            if( xx >= 1 && xx <= n ){
                                yy = yy > A[xx] ? A[xx] : yy;    
                                if( !vis[xx][yy] ){
                                    vis[xx][yy] = true;
                                    nxt.x = xx; nxt.y = yy; nxt.step = step+1;
                                    Q.push(nxt);
                                }
                            }    
                    }
            }
        }
    }
    int main(){
        while( scanf("%d", &n) != EOF)
        {
            for(int i = 1; i <= n; i++)
                scanf("%d", &A[i]), A[i]+=1;
            s.read(); t.read();    
            bfs();
        }
        return 0;
    }
  • 相关阅读:
    sentinel.conf样例
    哨兵模式java实例
    哨兵模式启动redis
    华为笔试:直角三角形个数
    leetcode 337. 打家劫舍iii
    leetcode 494. 目标数
    leetcode 394. 字符串解码
    leetcode 128. 最长连续子序列
    链表快排
    leetcode 877. 石子游戏
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/2809197.html
Copyright © 2020-2023  润新知