24h購物| | PChome| 登入
2009-03-11 19:30:36| 人氣459| 回應0 | 上一篇 | 下一篇

科技冬令營信息學 奧林匹克競賽樣題 八、草場普查

推薦 0 收藏 0 轉貼0 訂閱站台

遞迴的DFS

/***********************************************************/

#include<stdio.h>                 
#include<stdlib.h>     
int map[102][102];
void map2(int b,int a,int ans)
{
  if(map[b-1][a]>0) { map[b-1][a]=ans;map2(b-1,a,ans); }
  if(map[b][a-1]>0) { map[b][a-1]=ans; map2(b,a-1,ans); }
  if(map[b][a+1]>0) { map[b][a+1]=ans; map2(b,a+1,ans); }
  if(map[b+1][a]>0) { map[b+1][a]=ans; map2(b+1,a,ans); }
}
main()     
{     
 int a,b,c,n,m,time=0;
 while(scanf("%d %d",&n,&m)==2)
  {
   int grass[102][102],ans2[10000]={0},max=0;
   for(a=0;a<102;a++)
    for(b=0;b<102;b++)
     map[a][b]=0;
   int ans=0;
   for(b=1;b<=n;b++)
     for(a=1;a<=m;a++)
      {
       scanf("%d",&map[b][a]);
       grass[b][a]=map[b][a];
      }
   
    for(b=1;b<=n;b++)
      for(a=1;a<=m;a++)
        if(map[b][a]>0)
         {
          ans--;
          map[b][a]=ans;
          map2(b,a,ans);
         }
    for(b=1;b<=n;b++)
      for(a=1;a<=m;a++)
       ans2[abs(map[b][a])]+=grass[b][a];
    ans=abs(ans);
    for(a=1;a<=ans;a++)
     if(ans2[a]>max) max=ans2[a]; 
    printf("%d\n%d\n",abs(ans),max);
  }
 return 0;     
}

/**********************************************************/

優化輸入...優一下8Xms...

#include<stdio.h>                    
#include<stdlib.h>        
int input()  
{  
  char cha;  
  int x=0;  
  while(cha=getchar())  
     if(cha!=' '&&cha!='\n') break;  
  x=cha-48;  
  while(cha=getchar())   
    {  
     if(cha==' '||cha=='\n') break;  
      x=x*10+cha-48;  
    }  
    return x;  
}
int map[102][102];  
void map2(int b,int a,int ans)  
{  
  if(map[b-1][a]>0) { map[b-1][a]=ans;map2(b-1,a,ans); }  
  if(map[b][a-1]>0) { map[b][a-1]=ans; map2(b,a-1,ans); }   
  if(map[b][a+1]>0) { map[b][a+1]=ans; map2(b,a+1,ans); }   
  if(map[b+1][a]>0) { map[b+1][a]=ans; map2(b+1,a,ans); }   
}   
main()        
{        
 int a,b,c,n,m,time=0;  
 while(scanf("%d %d",&n,&m)==2)  
  {  
   int grass[102][102],ans2[10000]={0},max=0;  
   for(a=0;a<102;a++)  
    for(b=0;b<102;b++)  
     map[a][b]=0;  
   int ans=0;  
   for(b=1;b<=n;b++)   
     for(a=1;a<=m;a++)  
      {  
       map[b][a]=input(); 
       grass[b][a]=map[b][a];  
      }  
      
    for(b=1;b<=n;b++)  
      for(a=1;a<=m;a++)  
        if(map[b][a]>0)  
         {   
          ans--;  
          map[b][a]=ans;  
          map2(b,a,ans);   
         }  
    for(b=1;b<=n;b++)  
      for(a=1;a<=m;a++)  
       ans2[abs(map[b][a])]+=grass[b][a];  
    ans=abs(ans);  
    for(a=1;a<=ans;a++)  
     if(ans2[a]>max) max=ans2[a];    
    printf("%d\n%d\n",abs(ans),max);  
  }   
 return 0;        
}
 

台長: 來源不明
人氣(459) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: 資訊競賽 |
此分類下一篇:2008 TOI 研習營初選 TOI2008 2. 大數運算
此分類上一篇:96北市資訊學科能力競賽 序列長度問題(Sequence)

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文