5 5 2 2 1 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 1 2 2 0 1 1 1 3 4 4 1 1 1 1 1 3 1 2 1 1 1 3 1 1 1 4 4 4 1 2 3 4 8 7 6 5 9 10 11 12 16 15 14 13
YES NO YES YES
基本没写过几道搜索。由于从边缘进入,枚举边缘所有格子进行搜索即可,如果认真读题肯定可以知道能向低处走...以为只能平地或高一格还赏了一个WA。蛋疼
代码非常搓+渣:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<cstdio> #include<string> #include<deque> #include<stack> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; typedef long long LL; #define INF 0x3f3f3f3f int pos[110][110]; int vis[110][110]; int flag=0; int tall; int n,m; void look(const int &x,const int &y,const int &pre) { if(x<0||y<0||x>=n||y>=m||vis[x][y]==1)//边界+是否访问过判断 return; vis[x][y]=1;//标记访问 if(pos[x][y]-pre<=1) { if(pos[x][y]==tall) { flag=1; puts("YES"); return; } look(x+1,y,pos[x][y]); if(!flag) look(x-1,y,pos[x][y]); if(!flag) look(x,y+1,pos[x][y]); if(!flag) look(x,y-1,pos[x][y]); } else { vis[x][y]=0;//路不通,不算访问过。 return; } } int main(void) { int i,j; while (~scanf("%d%d",&n,&m)) { memset(pos,0,sizeof(pos)); tall=-1;flag=0; for (i=0; i<n; i++) { for (j=0; j<m; j++) { scanf("%d",&pos[i][j]); tall=max(tall,pos[i][j]); } } if(tall==0) { puts("NO"); continue; } for (j=0; j<m; j++) { if(pos[0][j]==1) { memset(vis,0,sizeof(vis)); look(0,j,0); } if(flag) break; } if(!flag) { for (j=0; j<m; j++) { if(pos[n-1][j]==1) { memset(vis,0,sizeof(vis)); look(n-1,j,0); } if(flag) break; } } if(!flag) { for (i=0; i<n; i++) { if(pos[i][0]==1) { memset(vis,0,sizeof(vis)); look(i,0,0); } if(flag) break; } } if(!flag) { for (i=0; i<n; i++) { if(pos[i][m-1]==1) { memset(vis,0,sizeof(vis)); look(i,m-1,0); } if(flag) break; } } if(!flag) puts("NO"); } return 0; }