ICode9

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

打开灯泡 Switch the Lamp On

2019-09-30 19:59:08  阅读:325  来源: 互联网

标签:aa return int Switch 灯泡 550 花费 step Lamp


https://loj.ac/problem/2632

题目描述

  给出n行m列的斜线,要求从(0,0)走到(n,m),只能往四个斜方向走,若斜线方向与走的方向相同,花费为0,否则花费为1.

思路

  比较经典的bfs题,可以看做是0,1最短路,用双端队列解决。用双端队列是为了维护队列中的单调性,即队列中元素的step一定时从队首到队尾单调递增的(并不严格递增)。不过这道题有一些细节需要注意。

   首先你要处理好路和点的关系,明确往哪里走需要查看的是那一条斜线。

   其次一个重要的点括号中也有提到,由于step并不是严格单增,所以我们并不能用vis数组储存是否访问过,因为例如我们现在在(2,2),到目前花费为0,能以1的代价走到(3,1),用vis数组记录后,从(2,0)能以总代价1走到(3,1),但由于已经访问过会忽略。所以我们可以用一个cost数组储存到(x,y)的最小花费,比较是否比最小花费小即可。

代码

#include<bits/stdc++.h>
using namespace std;

struct aa
{
    int x,y,step;
    aa(int x=0,int y=0,int step=0):x(x),y(y),step(step) {}
};

int dx[4]={1,1,-1,-1},dy[4]={1,-1,1,-1};
int px[4]={0,0,1,1},py[4]={0,1,0,1};
char mp[550][550];
bool check(int x,int y,int t)
{
    if(mp[x][y]=='/')
    {
        if(t==0||t==3)return 1;
        else return 0;
    }
    else
    {
        if(t==0||t==3)return 0;
        else return 1;
    }
}
int cost[550][550]; 
int n,m;
bool valid(int x,int y){return x>=0&&y>=0&&x<=n&&y<=m;}
void bfs(int sx,int sy)
{
    memset(cost,0x3f,sizeof(cost));
    deque<aa>q;
    q.push_front(aa(sx,sy,0));
    cost[sx][sy]=0;
    while(!q.empty())
    {
        aa u=q.front();q.pop_front();
        if(u.x==n&&u.y==m)
        {
            printf("%d",u.step);
            return ;
        } 
        for(int i=0;i<4;i++)
        {
            int nx=u.x+dx[i];
            int ny=u.y+dy[i];
            if(valid(nx,ny))
            {
                bool f=check(nx+px[i],ny+py[i],i);//用p数组实现斜线和点的转移 
                if(cost[nx][ny]<=cost[u.x][u.y]+f)continue ;//比较到这个点的花费,有等号 
                cost[nx][ny]=cost[u.x][u.y]+f;
                if(f)q.push_back(aa(nx,ny,u.step+1));//双端队列放队首、队尾 
                else q.push_front(aa(nx,ny,u.step));
            }
        }
    } 
    printf("NO SOLUTION");
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf(" %s",mp[i]+1);
    bfs(0,0);
}

 

标签:aa,return,int,Switch,灯泡,550,花费,step,Lamp
来源: https://www.cnblogs.com/fangbozhen/p/11613997.html

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

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

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

ICode9版权所有