#1519: 測資有漏洞?


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
c129. 00572 - Oil Deposits -- UVa572 | From: [210.62.247.243] | 發表日期 : 2009-03-09 19:36

/*  Result: AC (6ms, 274KB) on ZeroJudge                                   

#include<stdio.h>                 
#include<stdlib.h>     
char map[102][102],x[100];
void map2(int b,int a,int ans)
{
  if(map[b-1][a]=='@') { map[b-1][a]=ans;map2(b-1,a,ans); }
  if(map[b-1][a-1]=='@') { map[b-1][a]=ans; map2(b-1,a-1,ans); }
  if(map[b-1][a+1]=='@') { map[b-1][a+1]=ans; map2(b-1,a+1,ans); }
  if(map[b][a-1]=='@') { map[b][a-1]=ans; map2(b,a-1,ans); }
  if(map[b][a+1]=='@') { map[b][a+1]=ans; map2(b,a+1,ans); }
  if(map[b+1][a]=='@') { map[b+1][a]=ans; map2(b+1,a,ans); }
  if(map[b+1][a-1]=='@') {map[b+1][a-1]=ans; map2(b+1,a-1,ans); }
  if(map[b+1][a+1]=='@') {map[b+1][a+1]=ans; map2(b+1,a+1,ans); }
}
main()     
{     
 int a,b,c,n,m,time=0;
 while(scanf("%d %d ",&n,&m)==2)
  {
   if(n==0&&m==0) break;
   for(a=0;a<102;a++)
    for(b=0;b<102;b++)
     map[a][b]='*';
   int ans=0;
   for(b=1;b<=n;b++)
    {
     scanf("%s",x);
     for(a=1;a<=m;a++)
      map[b][a]=x[a-1];
    }
   
    for(b=1;b<=n;b++)
      for(a=1;a<=m;a++)
        if(map[b][a]=='@')
         {
          if(map[b-1][a]<0) {map[b][a]= map[b-1][a];continue;}
          if(map[b-1][a-1]<0) { map[b][a]=map[b-1][a];continue;}
          if(map[b-1][a+1]<0) {map[b][a]= map[b-1][a+1] ;continue; }
          if(map[b][a-1]<0) { map[b][a]=map[b][a-1];continue; }
          if(map[b][a+1]<0) { map[b][a]=map[b][a+1] ;continue;}
          if(map[b+1][a]<0) { map[b][a]=map[b+1][a] ;continue; }
          if(map[b+1][a-1]<0) {map[b][a]=map[b+1][a-1];continue; }
          if(map[b+1][a+1]<0) {map[b][a]=map[b+1][a+1]  ;continue;}
          ans--;
          map[b][a]=ans;
          map2(b,a,ans);
         }
    printf("%d\n",abs(ans));
  }
 return 0;     
}

非BFS的寫法,單純用遞迴卻AC@@

 
#1522: Re:測資有漏洞?


snail (蝸牛)

學校 : 新北市立板橋高級中學
編號 : 2021
來源 : [101.136.211.198]
最後登入時間 :
2024-05-18 22:04:56
c129. 00572 - Oil Deposits -- UVa572 | From: [203.64.161.123] | 發表日期 : 2009-03-10 09:55

你用的這個方法叫 DFS。DFS 和 BFS 最主要的差別是 DFS 用堆疊而 BFS 用佇列。你的程式雖然沒有明確地宣告一個堆疊,但是使用遞迴就是在使用系統內部的堆疊。

 
#1538: Re:測資有漏洞?


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
c129. 00572 - Oil Deposits -- UVa572 | From: [118.160.202.184] | 發表日期 : 2009-03-11 18:26

/*  Result: AC (6ms, 274KB) on ZeroJudge                                   

#include                 
#include     
char map[102][102],x[100];
void map2(int b,int a,int ans)
{
  if(map[b-1][a]=='@') { map[b-1][a]=ans;map2(b-1,a,ans); }
  if(map[b-1][a-1]=='@') { map[b-1][a]=ans; map2(b-1,a-1,ans); }
  if(map[b-1][a+1]=='@') { map[b-1][a+1]=ans; map2(b-1,a+1,ans); }
  if(map[b][a-1]=='@') { map[b][a-1]=ans; map2(b,a-1,ans); }
  if(map[b][a+1]=='@') { map[b][a+1]=ans; map2(b,a+1,ans); }
  if(map[b+1][a]=='@') { map[b+1][a]=ans; map2(b+1,a,ans); }
  if(map[b+1][a-1]=='@') {map[b+1][a-1]=ans; map2(b+1,a-1,ans); }
  if(map[b+1][a+1]=='@') {map[b+1][a+1]=ans; map2(b+1,a+1,ans); }
}
main()     
{     
 int a,b,c,n,m,time=0;
 while(scanf("%d %d ",&n,&m)==2)
  {
   if(n==0&&m==0) break;
   for(a=0;a<102;a++)
    for(b=0;b<102;b++)
     map[a][b]='*';
   int ans=0;
   for(b=1;b<=n;b++)
    {
     scanf("%s",x);
     for(a=1;a<=m;a++)
      map[b][a]=x[a-1];
    }
   
    for(b=1;b<=n;b++)
      for(a=1;a<=m;a++)
        if(map[b][a]=='@')
         {
          if(map[b-1][a]<0) {map[b][a]= map[b-1][a];continue;}
          if(map[b-1][a-1]<0) { map[b][a]=map[b-1][a];continue;}
          if(map[b-1][a+1]<0) {map[b][a]= map[b-1][a+1] ;continue; }
          if(map[b][a-1]<0) { map[b][a]=map[b][a-1];continue; }
          if(map[b][a+1]<0) { map[b][a]=map[b][a+1] ;continue;}
          if(map[b+1][a]<0) { map[b][a]=map[b+1][a] ;continue; }
          if(map[b+1][a-1]<0) {map[b][a]=map[b+1][a-1];continue; }
          if(map[b+1][a+1]<0) {map[b][a]=map[b+1][a+1]  ;continue;}
          ans--;
          map[b][a]=ans;
          map2(b,a,ans);
         }
    printf("%d\n",abs(ans));
  }
 return 0;     
}

非BFS的寫法,單純用遞迴卻AC@@

當我沒有紅色部分的時候 就會WA@@ 不知原因
 
#1541: Re:測資有漏洞?


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
c129. 00572 - Oil Deposits -- UVa572 | From: [118.160.202.184] | 發表日期 : 2009-03-11 19:20

/*  Result: AC (6ms, 274KB) on ZeroJudge                                   

#include                 
#include     
char map[102][102],x[100];
void map2(int b,int a,int ans)
{
  if(map[b-1][a]=='@') { map[b-1][a]=ans;map2(b-1,a,ans); }
  if(map[b-1][a-1]=='@') { map[b-1][a-1]=ans; map2(b-1,a-1,ans); }
  if(map[b-1][a+1]=='@') { map[b-1][a+1]=ans; map2(b-1,a+1,ans); }
  if(map[b][a-1]=='@') { map[b][a-1]=ans; map2(b,a-1,ans); }
  if(map[b][a+1]=='@') { map[b][a+1]=ans; map2(b,a+1,ans); }
  if(map[b+1][a]=='@') { map[b+1][a]=ans; map2(b+1,a,ans); }
  if(map[b+1][a-1]=='@') {map[b+1][a-1]=ans; map2(b+1,a-1,ans); }
  if(map[b+1][a+1]=='@') {map[b+1][a+1]=ans; map2(b+1,a+1,ans); }
}

找到錯誤了

 
#1545: Re:測資有漏洞?


bleed1979 (Bleed)

學校 : 不指定學校
編號 : 1489
來源 : [203.204.21.29]
最後登入時間 :
2021-05-02 22:12:13
c129. 00572 - Oil Deposits -- UVa572 | From: [118.168.130.197] | 發表日期 : 2009-03-12 23:52

你用的這個方法叫 DFS。DFS 和 BFS 最主要的差別是 DFS 用堆疊而 BFS 用佇列。你的程式雖然沒有明確地宣告一個堆疊,但是使用遞迴就是在使用系統內部的堆疊。


我以為也有個不錯聽的名稱是blood fill

 

 
#1546: Re:測資有漏洞?


sagit (sagit)

學校 : 國立臺中女子高級中學
編號 : 1457
來源 : [211.23.3.219]
最後登入時間 :
2024-04-25 11:50:16
c129. 00572 - Oil Deposits -- UVa572 | From: [203.64.45.5] | 發表日期 : 2009-03-13 09:17

你用的這個方法叫 DFS。DFS 和 BFS 最主要的差別是 DFS 用堆疊而 BFS 用佇列。你的程式雖然沒有明確地宣告一個堆疊,但是使用遞迴就是在使用系統內部的堆疊。


我以為也有個不錯聽的名稱是blood fill

 


我也以為那個不錯聽的名稱可能是 flood fill ,

是說 DFS、BFS 只是實作的方式不同, 原理是都一樣的....

 
ZeroJudge Forum