P1514 [NOIP2010 提高组] 引水入城
:::语言要多练-> dfs 回溯时 从小到大 迭代 省一次dfs
:::dfs / 树型结构-> vis[] ->节省不必要 搜索
//编写代码是== -》= ->>TLE 编译器·停止 //1.递归 ER 2.溢出 3. == 重复定义 /* 10 10 517 626 565 502 512 551 622 557 518 621 515 498 463 456 507 504 452 598 450 454 432 537 522 410 504 403 412 418 432 541 477 462 397 492 385 375 436 355 467 478 356 417 345 307 313 342 317 335 304 365 334 395 274 364 344 314 307 329 334 264 240 209 233 223 243 241 254 270 240 257 182 228 282 195 204 152 268 258 279 232 205 232 198 142 167 195 106 226 212 246 85 189 159 84 161 109 150 130 183 51 0 7 */ #include<cstdio> #include<bits/stdc++.h> using namespace std; const int maxn=510; int xx[4]={-1, 0, 1, 0}; int yy[4]={ 0, 1, 0,-1}; int n,m,high[maxn][maxn],vis[maxn][maxn],l[maxn][maxn],r[maxn][maxn]; void dfs(int x,int y)// { vis[x][y]=1; for(int i=0;i<4;i++) { int nx=x+xx[i],ny=y+yy[i]; if(nx<1||nx>n||ny<1||ny>m) continue;//? if(high[nx][ny]>=high[x][y]) continue;// if(vis[nx][ny]==0) dfs(nx,ny); l[x][y]=min(l[x][y],l[nx][ny]); r[x][y]=max(r[x][y],r[nx][ny]); } } int main() { memset(vis,0,sizeof(vis));memset(l,0x3f,sizeof(l));memset(r,0,sizeof(r)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&high[i][j]); for(int i=1;i<=m;i++) l[n][i]=r[n][i]=i; for(int i=1;i<=m;i++) if(vis[1][i]==0) dfs(1,i);// int flag=0,cnt=0; for(int i=1;i<=m;i++) if(vis[n][i]==0) { flag=1; cnt++;} if(flag){ printf("%d\n%d\n",0,cnt); return 0;} else { int left=1;cnt=0; while(left<=m) { int maxnr=0; for(int i=1;i<=m;i++) if(l[1][i]<=left) maxnr=max(maxnr,r[1][i]); left=maxnr+1;// cnt++; } printf("%d\n%d\n",1,cnt); } return 0; }

浙公网安备 33010602011771号