首页 > 其他分享 >P3956 [NOIP2017 普及组] 棋盘

P3956 [NOIP2017 普及组] 棋盘

时间:2024-04-05 14:44:45浏览次数:22  
标签:NOIP2017 idx idy int value que 棋盘 P3956 105

原题链接

题解

dijkstra算法的应用。相同颜色权值为0;不同颜色权值为1;有颜色到无颜色权值为2。其中不能连续两步走无颜色结点,即该情况需要特别考虑。

code

 

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e9;
int a[105][105],dis[105][105],vis[105][105];
int to[5]= {-1,0,1,0,-1},m,n;
struct Node {
    int idx,idy,value;
    bool operator >(const Node &a)const {
        return value>a.value;
    }
};
priority_queue<Node,vector<Node>,greater<Node> > que;
void build(int m) {
    for (int i=1; i<=m; i++)
        for (int j=1; j<=m; j++) {
            a[i][j]=0;
            vis[i][j]=0;
            dis[i][j]=MAX;
        }
}
void Push(Node x,int color,int k) {
    for (int i=0; i<4; i++) {
        Node y;
        y.idx=x.idx+to[i];
        y.idy=x.idy+to[i+1];
        if (x.idx+to[i]>=1 && x.idx+to[i]<=m)
            if (x.idy+to[i+1]>=1 && x.idy+to[i+1]<=m)
                if (vis[x.idx+to[i]][x.idy+to[i+1]]==0) {
                    if (color==1) {
                        if (a[y.idx][y.idy]==0 && k==0 && x.value+2<dis[y.idx][y.idy]) {
                            dis[y.idx][y.idy]=x.value+2;
                            y.value=x.value+2;
                            Push(y,color,k+1);
                        }
                        if (a[y.idx][y.idy]==1 && x.value<dis[y.idx][y.idy]) {
                            dis[y.idx][y.idy]=x.value;
                            y.value=x.value;
                            que.push(y);
                        }
                        if (a[y.idx][y.idy]==2 && x.value+1<dis[y.idx][y.idy]) {
                            dis[y.idx][y.idy]=x.value+1;
                            y.value=x.value+1;
                            que.push(y);
                        }
                    } else if (color==2) {
                        if (a[y.idx][y.idy]==0 && k==0 && x.value+2<dis[y.idx][y.idy]) {
                            dis[y.idx][y.idy]=x.value+2;
                            y.value=x.value+2;
                            Push(y,color,k+1);
                        }
                        if (a[y.idx][y.idy]==2 && x.value<dis[y.idx][y.idy]) {
                            dis[y.idx][y.idy]=x.value;
                            y.value=x.value;
                            que.push(y);
                        }
                        if (a[y.idx][y.idy]==1 && x.value+1<dis[y.idx][y.idy]) {
                            dis[y.idx][y.idy]=x.value+1;
                            y.value=x.value+1;
                            que.push(y);
                        }
                    }
                }
    }
}
int main() {
    cin>>m>>n;
    build(m);
    for (int i=1; i<=n; i++) {
        int x,y,c;
        cin>>x>>y>>c;
        if (c==0) a[x][y]=1;
        if (c==1) a[x][y]=2;
    }
    Node x;
    bool bol=false;
    x.idx=1;
    x.idy=1;
    x.value=0;
    dis[1][1]=0;
    que.push(x);
    while (!que.empty()) {
        x=que.top();
        que.pop();
        vis[x.idx][x.idy]=1;
        if (x.idx==m && x.idy==m) {
            cout<<dis[m][m]<<endl;
            bol=true;
            break;
        }
        if (dis[x.idx][x.idy]<x.value) continue;
        Push(x,a[x.idx][x.idy],0);
    }
    if (a[m][m]==0 && dis[m][m]!=MAX) cout<<dis[m][m];
    else if (bol==false)cout<<-1<<endl;
    return 0;
}

 

标签:NOIP2017,idx,idy,int,value,que,棋盘,P3956,105
From: https://www.cnblogs.com/purple123/p/18115755

相关文章

  • 2023年蓝桥杯省赛——棋盘
    目录题目链接:10.棋盘-蓝桥云课(lanqiao.cn)思路我的直接暴力思路代码实现前缀和思路前缀和:更多举例差分数组:更多举例前缀和与差分数组的关系如下代码实现 总结题目链接:10.棋盘-蓝桥云课(lanqiao.cn)思路我的直接暴力思路        我的这段Ja......
  • 2733: 【搜索】【广度优先】 马遍历棋盘
    题目描述有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步输入一行四个数据,棋盘的大小和马的坐标输出一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)样例输入4411样例输出0325......
  • [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目
    这肯定是学证明了,看这篇文章补充一下细节首先,\(m\)的范围应该是\([0,b-1]\)然后,当\(m\)取不同值的时候,\(ma\)%\(b\)一定为不同值(这个性质确实有点奇特,可以记下来)反证,如果\(m_1a\equivm_2a\:(mod\:b)\)且\(0≤m_1<m_2≤b-1\),那么就有\(b|(m_2-m_1)a\),题目给出了\(a,b\)互质,......
  • P3957 [NOIP2017 普及组] 跳房子
    原题链接题解二分加动态维护区间最大值注意设立变量的含义,改变变量值的规则code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;llsum[500005]={0};structunit{llx,v;booloperator<(constunit&b)const{returnb.v>v;}//}room[5000......
  • P3958 [NOIP2017 提高组] 奶酪
    原题链接思路并查集然后看看是否存在上表面联通的洞与下表面联通的洞位于同一集合code#include<bits/stdc++.h>usingnamespacestd;doublen,h,r;intfa[1005];vector<int>up,down;struct{doublex,y,z;}hole[1005];doubledis(inti,intj){returnpo......
  • P3957 [NOIP2017 普及组] 跳房子
    50分代码1//P3957[NOIP2017普及组]跳房子2#include<iostream>3#include<queue>4#include<cstring>5#include<cmath>6usingnamespacestd;7typedeflonglongll;8intn,d,k;9inta[500010][2];10llf[500010],sum=0;11boo......
  • 小Q的棋盘
    我们先按树形DP做我们模拟一下如何走,会发现有可能会先从根节点往下走,然后回到根节点,再从根节点继续往下走,这个过程甚至可以重复多次所以我们会发现很重要的一点就是是否回到根节点,所以我们设\(f[i][j][0/1]\)表示根节点是\(i\),走\(j\)步,终点是不是根节点的最多走的点数(注意这里......
  • 张正友棋盘代码-python
    具体实现方案:棋盘是一块由黑白方块间隔组成的标定板,我们用它来作为相机标定的标定物(从真实世界映射到数字图像内的对象)。之所以我们用棋盘作为标定物是因为平面棋盘模式更容易处理(相对于复杂的三维物体),但与此同时,二维物体相对于三维物体会缺少一部分信息,于是我们会多次改变棋盘的......
  • 棋盘问题
    【问题描述】小蓝拥有n× n大小的棋盘,一开始棋盘上全都是白子。小蓝进行了m次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。【输入格式】输入的第一行包含两个整数n,m,用一......
  • 2023南海区信息学区赛(初中组)T2棋盘(原始)
    第2题   棋盘(原始) 查看测评数据信息有一个R行C列的棋盘,共有R×C个单元格子,每个单元格子都要放一个棋子,棋子只有黑色或者白色。如果两个单元格子有公共边,那么称为相邻的格子。如果一个棋盘满足所有相邻格子的棋子都是不同颜色,那么就称为“优美”棋盘;否则称为“普通”......