zoukankan      html  css  js  c++  java
  • 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;
    }
    宝剑锋从磨砺出 梅花香自苦寒来
  • 相关阅读:
    ubuntu下文件安装与卸载
    webkit中的JavaScriptCore部分
    ubuntu 显示文件夹中的隐藏文件
    C语言中的fscanf函数
    test
    Use SandCastle to generate help document automatically.
    XElement Getting OuterXML and InnerXML
    XUACompatible meta 用法
    Adobe Dreamweaver CS5.5 中文版 下载 注册码
    The Difference Between jQuery’s .bind(), .live(), and .delegate()
  • 原文地址:https://www.cnblogs.com/GHzcx/p/8724120.html
Copyright © 2011-2022 走看看