jzoj 3813. 我要的幸福 (Standard IO)

Description
幸福/我要的幸福/漸漸清楚/夢想/理想/幻想/狂想/妄想/我只想堅持每一步/該走的方向/就算一路上/偶爾會沮喪/生活是自己/選擇的衣裳/幸福/我要的幸福/沒有束縛/幸福/我要的幸福/在不遠處

Zyh相信自己想要的幸福在不遠處。然而,zyh想要得到這幸福,還需要很長的一段路。Zyh堅持認爲整個人生可以抽象爲一個n*m的棋盤。左上角的格子爲(1,1),右下角的格子爲(n,m)。整個棋盤上的格子都有不同的事件,因爲生活的多姿多彩,事件的權值Aij都兩兩不同。不幸的是,在整個人生中有若干個極其黑暗的事件,它們的權值Aij=0。更進一步說,對於Aij>0的事件,權值兩兩不同。
Zyh站在人生的起點(1,1),他想要走向人生的巔峯(n,m)。Zyh認爲人只能前進,即若Zyh站在(a,b),他只能走向(a,b+1)或者(a+1,b)。並且Zyh認爲黑暗的事件是絕對不可以觸碰的,因爲一旦經歷就會墜入萬丈深淵。Zyh會將自己所經歷的事件的權值依次寫出,形成一個n+m-1的序列。Zyh想知道其中字典序最小的序列是什麼。若是人生過於艱難,沒有一個合法序列,就輸出”Oh,the life is too difficult!”,不包含引號。

Input
輸入的第一行是兩個正整數n和m。接着是n行m列的人生棋盤。

Output
輸入只有一列,如果存在合法序列,則爲n+m-1個用一個空格隔開的權值。否則就輸出Oh,the life is too difficult!

Sample Input
輸入1:
3 3
1 3 4
7 9 0
5 6 8
輸入2:
2 3
1 0 3
0 4 5

Sample Output
輸出1:
1 3 9 6 8
輸出2:
Oh,the life is too difficult!

Data Constraint
對於20%的數據 n<10 m<10
對於60%的數據 n<=300 m<=300
對於100%的數據 n<=1000 m<=1000 Aij<=1e9

//written by zzy

題目大意:

從起點到終點的路徑(有些不能走,只能向下或右走)的最小字典序

題解:

考慮從終點(n,m)往前倒着染色,被染到的點一定可以到達終點,再從起點開始貪心走即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;

int i,j,n,m;
int a[N][N];
bool b[N][N];

void color(int x,int y)
{
	b[x][y]=true;
	if (x==1&&y==1) return;
	if (x-1>=1&&b[x-1][y]==0&&a[x-1][y]!=0) color(x-1,y);
	if (y-1>=1&&b[x][y-1]==0&&a[x][y-1]!=0) color(x,y-1); 
}

void dfs(int x,int y)
{
    printf("%d ",a[x][y]);
    if (x==n&&y==m) return;
    if (b[x][y+1]&&(b[x+1][y]==0||a[x][y+1]<a[x+1][y])) dfs(x,y+1);else
    if (b[x+1][y]&&(b[x][y+1]==0||a[x][y+1]>a[x+1][y])) dfs(x+1,y);
}

int main()
{
	memset(b,0,sizeof(b));
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
	 for (j=1;j<=m;j++)
	  scanf("%d",&a[i][j]);
    color(n,m);
    if (b[1][1]) dfs(1,1);
    else printf("Oh,the life is too difficult!");
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章