【NOIP2014模拟赛No.1】我要的幸福

OJ题号:ZHOJ1297

思路:搜索。

先预处理注定不能走的路径,然后dfs可以走的路径。

 1 #pragma GCC optimize ("O2")
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cctype>
 5 const int N=1001;
 6 int n,m,len,a[N][N]={{0}},path[N<<1];
 7 int getint() {
 8     register char ch;
 9     while(!isdigit(ch=getchar()));
10     register int x=ch^'0';
11     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
12     return x;
13 }
14 void printpath() {
15     for(int i=0;i<len;i++) printf("%d ",path[i]);
16     puts("");
17 }
18 void dfs(int x,int y) {
19     if(!a[x][y]) return;
20     path[x+y]=a[x][y];
21     if((x+y+1)==len) {
22         printpath();
23         exit(0);
24     }
25     if((x+1)==n) {
26         dfs(x,y+1);
27         return;
28     }
29     if((y+1)==m) {
30         dfs(x+1,y);
31         return;
32     }
33     if(a[x+1][y]<a[x][y+1]) {
34         dfs(x+1,y);
35         dfs(x,y+1);
36     }
37     else {
38         dfs(x,y+1);
39         dfs(x+1,y);
40     }
41 }
42 int main() {
43     n=getint();
44     m=getint();
45     len=n+m-1;
46     for(register int i=0;i<n;i++) {
47         for(register int j=0;j<m;j++) {
48             a[i][j]=getint();
49         }
50     }
51     for(register int i=n-1;i>=0;i--) {
52         for(register int j=m-1;j>=0;j--) {
53             if((i==(n-1))&&(j==(m-1))) continue;
54             if(!a[i+1][j]&&!a[i][j+1]) a[i][j]=0;
55         }
56     }
57     if(a[n-1][m-1]) dfs(0,0);
58     puts("Oh,the life is too difficult!");
59     return 0;
60 }

 

posted @ 2017-06-07 10:41  skylee03  阅读(145)  评论(0编辑  收藏  举报