首页 > 代码库 > 【NOIP2014模拟赛No.1】我要的幸福

【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 }

 

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