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!",不包含引号。
幸福/我要的幸福/渐渐清楚/梦想/理想/幻想/狂想/妄想/我只想坚持每一步/该走的方向/就算一路上/偶尔会沮丧/
生活是自己/选择的衣裳/幸福/我要的幸福/没有束缚/幸福/我要的幸福/在不远处
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<=1000 m<=1000 Aij<=1e9
输出
输入只有一列,如果存在合法序列,则为n+m-1个用一个空格隔开的权值。
否则就输出Oh,the life is too difficult!
否则就输出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 }