专栏文章

题解:P13710 [NWERC 2023] Klompendans

P13710题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioarxeq
此快照首次捕获于
2025/12/02 16:09
3 个月前
此快照最后确认于
2025/12/02 16:09
3 个月前
查看原文
思路 : 用广搜探寻所有可能的道路,建立两个数组,分别存储移动方式一和移动方式二的所有可能方向
废话不多说,上代码(有点长)
CPP
#include<bits/stdc++.h> 
using namespace std;
struct p{
    int x, y, move;
};
int main(){
    int n,a,b,c,d;
    cin>>n;
    cin>>a>>b;
    cin>>c>>d;
    vector<pair<int, int> > dirs1;// 记录第一种移动8个方向 
    dirs1.push_back(make_pair(a, b));
    dirs1.push_back(make_pair(a, -b));
    dirs1.push_back(make_pair(-a, b));
    dirs1.push_back(make_pair(-a, -b));
    dirs1.push_back(make_pair(b, a));
    dirs1.push_back(make_pair(b, -a));
    dirs1.push_back(make_pair(-b, a));
    dirs1.push_back(make_pair(-b, -a));
    vector<pair<int, int> > dirs2;// 记录第二种移动8个方向 
    dirs2.push_back(make_pair(c, d));
    dirs2.push_back(make_pair(c, -d));
    dirs2.push_back(make_pair(-c, d));
    dirs2.push_back(make_pair(-c, -d));
    dirs2.push_back(make_pair(d, c));
    dirs2.push_back(make_pair(d, -c));
    dirs2.push_back(make_pair(-d, c));
    dirs2.push_back(make_pair(-d, -c));
    vector<vector<bool> > r(n,vector<bool>(n,false));// 记录是否可达
    vector<vector<bool> > vis1(n,vector<bool>(n,false));// 记录类型1或类型2到达的位置,避免重复访问
    vector<vector<bool> > vis2(n,vector<bool>(n,false));
    r[0][0]=true;// 起点(0,0)是可达的
    queue<p> q;// BFS队列
    for (int i=0;i<dirs1.size();i++){// 如果第一步是动作1 
        int dx=dirs1[i].first;
        int dy=dirs1[i].second;
        int x=0+dx;
        int y=0+dy;
        if(x>=0&&x<n&&y>=0&&y<n&&!vis1[x][y]){
            vis1[x][y]=true;
            r[x][y]=true;
            q.push({x,y,1});
        }
    }
    // 如果第一步是动作2 
    for(int i=0;i<dirs2.size();i++){
        int dx=dirs2[i].first;
        int dy=dirs2[i].second;
        int x=0+dx;
        int y=0+dy;
        if(x>=0&&x<n&&y>=0&&y<n&&!vis2[x][y]){
            vis2[x][y]=true;
            r[x][y]=true;
            q.push({x,y,2});
        }
    }
    while(!q.empty()){// 广搜
        p c=q.front();
        q.pop();
        int nex=3-c.move;
        if(nex==1){// 动作1
            for(int i=0;i<dirs1.size();i++){
                int dx=dirs1[i].first;
                int dy=dirs1[i].second;
                int nx=c.x+dx;
                int ny=c.y+dy;
                if(nx>=0&&nx<n&&ny>=0&&ny<n&&!vis1[nx][ny]){
                    vis1[nx][ny]=true;
                    r[nx][ny]=true;
                    q.push({nx,ny,1});
                }
            }
        }
		else{// 动作2
            for(int i=0;i<dirs2.size();i++){ 
                int dx=dirs2[i].first;
                int dy=dirs2[i].second;
                int nx=c.x+dx;
                int ny=c.y+dy;
                if (nx>=0&&nx<n&&ny>=0&&ny<n&&!vis2[nx][ny]){
                    vis2[nx][ny]=true;
                    r[nx][ny]=true;
                    q.push({nx,ny,2});
                }
            }
        }
    }
    int count=0;// 统计答案 
    for(int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            if(r[i][j]){
                count++;
            }
        }
    }
    cout<<count<<endl;
    return 0;
}
这是蒟蒻第一篇题解,大佬们勿喷。审核大大辛苦了

评论

0 条评论,欢迎与作者交流。

正在加载评论...