ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷1126

2022-01-29 17:31:28  阅读:150  来源: 互联网

标签:洛谷 cout temp start int res 1126 vis



title: "bfs + 模拟"
author: Sun-Wind
date: January 29,2022

凡是涉及到模拟的一般坑也会比较多,在这道题我遇到的坑包括但不限于

  • 判断每一步的障碍,并且在判断到障碍后直接跳出,不能继续向前
  • 这个球是有体积的,也就是说题目中给我们的只是他边角上的一个点,还需要判断其他4个点是否符合要求
  • 注意有可能起始坐标和终点坐标相同
#include<iostream>
#include<utility>
#include<queue>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
//#define DEBUG
int thing[55][55];
int dir[4] = {0,1,2,3};//表示方向
struct point{
    int x,y,step;
    int state;
};
int start_x,start_y,end_x,end_y;
char temp;
int res;
int n,m;
bool vis[55][55][4];
queue<point> que;
bool check(int p,int q){
    if(thing[p][q]) return false;
    if(p + 1 <= n){
        if(thing[p+1][q]) return false;
        if(q + 1 <= m){
            if(thing[p+1][q+1]) return false;
        }
        else return false;
    }
    else return false;
    if(q + 1 <= m){
        if(thing[p][q+1]) return false;
    }
    else return false;
    return true;
}
int bfs(){
    queue<point> que;
    que.push({start_x,start_y,0,res});
    vis[start_x][start_y][res] = true;
    while(!que.empty()){
        point temp = que.front();
        que.pop();
        fi(i,1,3){
            if(temp.state == 0){
                int p = temp.x;
                int q = temp.y + i;
                if(q < 1 || q > m) continue;
                if(!vis[p][q][0]){
                    if(!check(p,q)){
                        // vis[p][q][0] = true;
                        break;
                    }
                    // cout << p <<" " <<  q << " " << temp.step+1;
                    // cout << endl;
                    if(p == end_x && q == end_y)
                        return temp.step + 1;
                    que.push({p,q,temp.step+1,0});
                    vis[p][q][0] = true;
                }
            }
            else if(temp.state == 1){
                int p = temp.x + i;
                int q = temp.y;
                if(p < 1 || p > n) continue;
                if(!vis[p][q][1]){
                    if(!check(p,q)){
                        // vis[p][q][1] = true;
                        break;
                    }
                    // cout << p <<" " <<  q << " " << temp.step+1;
                    // cout << endl;
                    if(p == end_x && q == end_y)
                        return temp.step + 1;
                    que.push({p,q,temp.step+1,1});
                    vis[p][q][1] = true;
                }
            }
            else if(temp.state == 2){
                int p = temp.x;
                int q = temp.y - i;
                if(q < 1 || q > m) continue;
                if(!vis[p][q][2]){
                    if(!check(p,q)){
                        // vis[p][q][2] = true;
                        break;
                    }
                    // cout << p <<" " <<  q << " " << temp.step+1;
                    // cout << endl;
                    if(p == end_x && q == end_y)
                        return temp.step + 1;
                    que.push({p,q,temp.step+1,2});
                    vis[p][q][2] = true;
                }
            }
            else if(temp.state == 3){
                int p = temp.x - i;
                int q = temp.y;
                if(p < 1 || p > n) continue;
                if(!vis[p][q][3]){
                    if(!check(p,q)){
                        // vis[p][q][3] = true;
                        break;
                    }
                    // cout << p <<" " <<  q << " " << temp.step+1;
                    // cout << endl;
                    if(p == end_x && q == end_y)
                        return temp.step + 1;
                    que.push({p,q,temp.step+1,3});
                    vis[p][q][3] = true;
                }
            }
        }
        fi(i,1,3){
            if(i == 2) continue;
            int p = (temp.state + i) % 4;
            if(!vis[temp.x][temp.y][p])
                {
                    que.push({temp.x,temp.y,temp.step+1,p});
                    vis[temp.x][temp.y][p] = true;
                }
        }
    }
    return -1;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    fi(i,1,n) fi(j,1,m)
    cin >> thing[i][j];
    cin >> start_x >> start_y >> end_x >> end_y;
    if(start_x == end_x && start_y == end_y) {
        cout << 0 << endl;
        return 0;
    }
    cin >> temp;
    if(temp == 'E') res = 0;
    else if(temp == 'S') res = 1;
    else if(temp == 'W') res = 2;
    else res = 3;
    cout << bfs() << endl;
#ifdef DEBUG
    //freopen(D:\in.txt,r,stdin);
#endif
    return 0;
}

标签:洛谷,cout,temp,start,int,res,1126,vis
来源: https://www.cnblogs.com/Sun-Wind/p/15855486.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有