/* 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@@
你用的這個方法叫 DFS。DFS 和 BFS 最主要的差別是 DFS 用堆疊而 BFS 用佇列。你的程式雖然沒有明確地宣告一個堆疊,但是使用遞迴就是在使用系統內部的堆疊。
/* 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@@
/* 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); }
}
你用的這個方法叫 DFS。DFS 和 BFS 最主要的差別是 DFS 用堆疊而 BFS 用佇列。你的程式雖然沒有明確地宣告一個堆疊,但是使用遞迴就是在使用系統內部的堆疊。
我以為也有個不錯聽的名稱是blood fill
你用的這個方法叫 DFS。DFS 和 BFS 最主要的差別是 DFS 用堆疊而 BFS 用佇列。你的程式雖然沒有明確地宣告一個堆疊,但是使用遞迴就是在使用系統內部的堆疊。
我以為也有個不錯聽的名稱是blood fill
我也以為那個不錯聽的名稱可能是 flood fill ,
是說 DFS、BFS 只是實作的方式不同, 原理是都一樣的....