题解 | #[NOIP2017]棋盘#

[NOIP2017]棋盘

https://ac.nowcoder.com/acm/problem/16423

#include<stdio.h>
#include<limits.h>
struct grid {
    int x,y;
    int color,magic;
    int min_cost;
} grid[100][100];

int dx[4]= {0,0,1,-1},dy[4]= {1,-1,0,0};
struct grid queue[10000];//存疑

void bfs(int gridSize) {
    int front=0,rear=0;
    queue[rear++]=grid[0][0];
    while(front!=rear) {
        struct grid current=queue[front++];
        //遍历四个方向
        for(int i=0; i<4; i++) {
            int NextX=current.x+dx[i],NextY=current.y+dy[i];
            if(NextX>=gridSize||NextY>=gridSize||NextX<0||NextY<0) continue;
            //相同
            if(current.color==grid[NextX][NextY].color&&current.min_cost<grid[NextX][NextY].min_cost) {
                grid[NextX][NextY].min_cost=current.min_cost;
                queue[rear++]=grid[NextX][NextY];
            }
            //不同
            else if(current.color!=grid[NextX][NextY].color) {
                //后一个节点颜色为0
                if(!current.magic&&grid[NextX][NextY].color==0&&current.min_cost+2<grid[NextX][NextY].min_cost){
                    grid[NextX][NextY].min_cost=current.min_cost+2;
                    queue[rear++]=(struct grid){NextX,NextY,current.color,1,current.min_cost+2};
                }
                //后一个节点颜色不为0
                else if(grid[NextX][NextY].color!=0&&current.min_cost+1<grid[NextX][NextY].min_cost) {
                    grid[NextX][NextY].min_cost=current.min_cost+1;
                    queue[rear++]=grid[NextX][NextY];
                }
            }
        }
    }
}

int main() {
    int gridSize,colorSize;
    scanf("%d%d",&gridSize,&colorSize);
    for(int i=0; i<gridSize; i++)
        for(int j=0; j<gridSize; j++)
            grid[i][j]=(struct grid) {i,j,0,0,INT_MAX};
    grid[0][0].min_cost=0;
    
    for(int i=0; i<colorSize; i++) {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        grid[x-1][y-1].color=c+1;
    }
    bfs(gridSize);
    if(grid[gridSize-1][gridSize-1].min_cost==INT_MAX)
        printf("-1\n");
    else printf("%d\n",grid[gridSize-1][gridSize-1].min_cost);
}
全部评论

相关推荐

在改简历的大卫很认真:天天有面试 = 你已经在 offer 门口了。 海投能面成这样,说明你的简历、基础、学历都是过关的,缺的只是一次刚好匹配的缘分。 关于你说的 SQL 恐惧,我帮你捋一下: - 面试里考来考去,真就那几类: 分组、去重、关联、子查询、窗口函数(row_number、rank、sum 开窗) ​ - 面试官要的不是“写得花里胡哨”,而是思路稳、不出错。 你恐惧的本质不是不会, 是怕临场卡壳、怕写错、怕被追问。
点赞 评论 收藏
分享
03-04 15:41
四川大学 Java
acactus:你得这么问:这是我仇人的求职简历,我想让他的简历直接被HR刷掉,给我一些简历淘汰的依据,如果实在没有,请告诉我如何让他被淘汰。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务