zoukankan      html  css  js  c++  java
  • 【题解】[NOIP模拟题]我要的幸福-C++

    题目
    Description
    我要的幸福(happiness)
    幸福/我要的幸福/渐渐清楚/梦想/理想/幻想/狂想/妄想/我只想坚持每一步/该走的方向/就算一路上/偶尔会沮丧/
    生活是自己/选择的衣裳/幸福/我要的幸福/没有束缚/幸福/我要的幸福/在不远处
    Description
    Zyh相信自己想要的幸福在不远处。然而,zyh想要得到这幸福,还需要很长的一段路。Zyh坚持认为整个人生可以
    抽象为一个n*m的棋盘。左上角的格子为(1,1),右下角的格子为(n,m)。整个棋盘上的格子都有不同的事件,因为
    生活的多姿多彩,事件的权值Aij都两两不同。不幸的是,在整个人生中有若干个极其黑暗的事件,它们的权值Aij
    =0。更进一步说,对于Aij>0的事件,权值两两不同。Zyh站在人生的起点(1,1),他想要走向人生的巅峰(n,m)。Zy
    h认为人只能前进,即若Zyh站在(a,b),他只能走向(a,b+1)或者(a+1,b)。并且Zyh认为黑暗的事件是绝对不可以触
    碰的,因为一旦经历就会坠入万丈深渊。Zyh会将自己所经历的事件的权值依次写出,形成一个n+m-1的序列。Zyh
    想知道其中字典序最小的序列是什么。若是人生过于艰难,没有一个合法序列,就输出"Oh,the life is too diff
    icult!",不包含引号。
    Input
    输入的第一行是两个正整数n和m。接着是n行m列的人生棋盘。
    n<=1000 m<=1000 Aij<=1e9
    Output
    输入只有一列,如果存在合法序列,则为n+m-1个用一个空格隔开的权值。
    否则就输出Oh,the life is too difficult!
    Sample Input
    3 3
    1 3 4
    7 9 0
    5 6 8
    Sample Output
    1 3 9 6 8

    思路
    先从(n,m)出发搜一遍,如果最后(1,1)没有被标记,那么这组数据是无解的。
    如果有解,搜完一遍之后利用标记,用贪心输出。
    其他的就很简单了。

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int a[1010][1010],n,m;
     4 bool vis[1010][1010];
     5 inline int read()
     6 {
     7     int data=0;
     8     char ch=0;
     9     while(ch<'0'||ch>'9')
    10         ch=getchar();
    11     while(ch>='0'&&ch<='9')
    12         data=data*10+ch-'0',ch=getchar();
    13     return data;
    14 }
    15 struct node
    16 {
    17     int x,y;
    18 };
    19 bool in(int x,int y)
    20 {
    21     return 1<=x&&x<=n&&0<=y&&y<=m;
    22 }
    23 void bfs(int x,int y)
    24 {
    25       
    26     int dir[2][2]={{-1,0},{0,-1}};
    27     queue<node> q;
    28     q.push((node){x,y});
    29     vis[x][y]=1;
    30     while(!q.empty())
    31     {
    32         node now=q.front();
    33         q.pop();
    34         for(int i=0;i<2;i++)
    35         {
    36             int tx=now.x+dir[i][0],ty=now.y+dir[i][1];
    37             if(!vis[tx][ty]&&in(tx,ty)&&a[tx][ty]!=0)
    38             {
    39                 q.push((node){tx,ty});
    40                 vis[tx][ty]=1;
    41                   
    42             }
    43         }
    44     }
    45     if(!vis[1][1])
    46     {
    47         cout<<"Oh,the life is too difficult!"<<endl;
    48         exit(0);
    49     }
    50 }
    51 int main()
    52 {
    53     n=read(),m=read();
    54     for(int i=1;i<=n;i++)
    55         for(int j=1;j<=m;j++)
    56             a[i][j]=read();
    57     bfs(n,m);
    58     int x=1,y=1;
    59     while(x!=n||y!=m)
    60     {
    61         cout<<a[x][y]<<" ";
    62         if(!vis[x][y+1]||y+1>m)x++;
    63         else
    64             if(!vis[x+1][y]||x+1>n)y++;
    65             else
    66             {
    67                 if(a[x][y+1]<a[x+1][y])y++;
    68                 else x++;
    69             }
    70     }
    71     cout<<a[n][m]<<endl;
    72     return 0;
    73 }
    个人博客地址: www.moyujiang.com 或 moyujiang.top
  • 相关阅读:
    根据当前系统时钟或签名文件的时间戳记核对时,所需要的凭证不在有效期内。
    自定义生成二维码
    MyBatis 开发学习记录
    SPRINGCLOUD 开发学习记录
    DOCKER 开发学习记录
    Spring in action学习笔记
    23种设计模式JAVA 实现目录总结
    访问者模式
    迭代器模式
    简单工厂模式
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11213637.html
Copyright © 2011-2022 走看看