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;
 } 
View Code

 

 
posted @ 2023-08-11 10:26  JMXZ  阅读(10)  评论(0)    收藏  举报