NOIP模拟题【我要的幸福】

描述

我要的幸福(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!",不包含引号。

输入输出格式

输入

  输入的第一行是两个正整数n和m。接着是n行m列的人生棋盘。
  n<=1000 m<=1000 Aij<=1e9

输出

  输入只有一列,如果存在合法序列,则为n+m-1个用一个空格隔开的权值。
  否则就输出Oh,the life is too difficult!

输入输出样例

输入样例

3 3
1 3 4
7 9 0
5 6 8

输出样例

1 3 9 6 8

解题思路

  一拿到这道题,果断贪心,可是万一搜到的路上有0怎么办呢?所以,我们先从终点向回搜,判断道路是否能走,并且没走到终点,就输出Oh,the life is too difficult!

  然后再从起点开始搜,每次去取的输出就行了。

题解

  

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int mp[1001][1001]; 
 5 bool flag[1001][1001];
 6 int dir[4][2]={-1,0,0,-1,1,0,-1,0};
 7 struct node{
 8     int x;
 9     int y;
10 };
11 inline int read()
12 {
13     int data=0; char ch=0;
14     while(ch<'0' || ch>'9') ch=getchar();
15     while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();
16     return data;
17 }
18 int main()
19 {
20     cin>>n>>m;
21     for(int i=1;i<=n;i++)
22     {
23         for(int j=1;j<=m;j++)
24         {
25             mp[i][j]=read();//快读优化 
26         }
27     }
28     flag[n][m]=true;//终点能到达 
29     for(int i=n;i;i--)
30         for(int j=m;j;j--)
31         {
32             if(!mp[i][j])//是0不走 
33             {
34                 flag[i][j]=false;
35                 continue;
36             }
37             if(i==n&&j==m)continue;
38             flag[i][j]=flag[i+1][j]|flag[i][j+1];//如果有一条路能走,就能到达 
39         }
40     if(!flag[1][1])//没有路径 
41     {
42         cout<<"Oh,the life is too difficult!";
43         return 0;
44     }
45     int x=1,y=1;//起点开始搜 
46     while(x!=n||y!=m)
47     {
48         cout<<mp[x][y]<<" ";//输出 
49         if(!flag[x][y+1]||y+1>m)x++;
50         else    if(!flag[x+1][y]||x+1>n)y++;
51         else    if(mp[x][y+1]<mp[x+1][y])y++;
52         else x++;
53     }
54     cout<<mp[n][m];//输出终点的 
55 }
原文地址:https://www.cnblogs.com/hualian/p/11193833.html