• CF 某套题 O :Grid (简单BFS)


    题意:

    从左上角跳到右下角最少需要多少步,跳的规则为:可以向四个方向的任意一个方向跳当前格子中的步数,若跳不到右下角输出IMPOSSIBLE。

    题解:

     BFS搜索,注意判断边界,标记。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <stdio.h>
    #include <cmath>
    #include <cstring>
    #include <vector>
    #include <map>
    #include <set>
    #include <bitset>
    #include <queue>
    #include <cstdlib>
    #include <utility>
    using namespace std;
    #define is_lower(c) (c>='a' && c<='z')
    #define is_upper(c) (c>='A' && c<='Z')
    #define is_alpha(c) (is_lower(c) || is_upper(c))
    #define is_digit(c) (c>='0' && c<='9')
    #define min(a,b) ((a)<(b)?(a):(b))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define IO ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
    #define For(i,a,b) for(int i = a; i <= b; i++)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    typedef pair<int,int > pll;
    typedef vector<int> vi;
    const ll inf=0x3f3f3f3f;
    const double EPS=1e-10;
    const ll inf_ll=(ll)1e18;
    const ll maxn=100005LL;
    const ll mod=1000000007LL;
    const int N = 500+5;
    pair <int,int> p;
    queue <pii> q;
    int mp[N][N];
    int xx[N][N];
    bool vis[N][N];
    int main() {
        int m,n;
        cin >> m >> n;
        For(i,1,m)
            For(j,1,n)
                scanf("%1d",&mp[i][j]);
        p.first = 1;p.second = 1;
        q.push(p);
        vis[1][1] = 1;
        int sum = 0;
        while(!q.empty()){
            pii x = q.front();
            q.pop();
            int step = mp[x.first][x.second];
            pii x1;
            if((x.first+step)>=1&&(x.first+step)<=m&&!vis[x.first+step][x.second]){
                x1.first = x.first+step,x1.second = x.second;
                q.push(x1);
                xx[x1.first][x1.second] = xx[x.first][x.second]+1;
                vis[x1.first][x1.second] = 1;
            }//向下
            if((x.first-step)>=1&&(x.first-step)<=m&&!vis[x.first-step][x.second]){
                x1.first = x.first-step,x1.second = x.second;
                q.push(x1);
                xx[x1.first][x1.second] = xx[x.first][x.second]+1;
                vis[x1.first][x1.second] = 1;
            }// up
            if((x.second+step)>=1&&(x.second+step)<=n&&!vis[x.first][x.second+step]){
                x1.first = x.first,x1.second = x.second+step;
                q.push(x1);
                xx[x1.first][x1.second] = xx[x.first][x.second]+1;
                vis[x1.first][x1.second] = 1;
            }
            if((x.second-step)>=1&&(x.second-step)<=n&&!vis[x.first][x.second-step]){
                x1.first = x.first,x1.second = x.second-step;
                q.push(x1);
                xx[x1.first][x1.second] = xx[x.first][x.second]+1;
                vis[x1.first][x1.second] = 1;
            }
            if(xx[m][n]!=0)
                break;
        }
        if(xx[m][n]!=0)
            cout << xx[m][n] <<endl;
        else
            cout <<"IMPOSSIBLE" << endl;
        return 0;
    }
    宝剑锋从磨砺出 梅花香自苦寒来
  • 相关阅读:
    Node.js理解
    PayPal为什么从Java迁移到Node.js
    移动开发技巧总结
    Flex性能调优相关的一些总结
    Flex组件的生命周期
    Adobe Flash Builder 4.7 新功能详解
    【Django】Cookie
    【Django】路由系统
    【Django】视图系统
    【Django】ORM操作#2
  • 原文地址:https://www.cnblogs.com/GHzcx/p/8724120.html
Copyright © 2020-2023  润新知