B - Red and Black
思路
从起点出发,往四个方向搜索,找到’#‘就变为’.’,边找边计数
代码c
#include <stdio.h>
int cnt;
void find(int fha, int fwa, int fh, int fw, char fa[][22]);
void up(int uha, int uwa, int uh, int uw, char ua[][22])
{
uha--;
if(uha<0||uwa<0||uha>=uh||uwa>=uw)
return ;
if(ua[uha][uwa]=='.'){
ua[uha][uwa]='#';
cnt++;
find(uha, uwa, uh, uw, ua);
}
}
void down(int dha, int dwa, int dh, int dw, char da[][22])
{
dha++;
if(dha<0||dwa<0||dha>=dh||dwa>=dw)
return ;
if(da[dha][dwa]=='.'){
da[dha][dwa]='#';
cnt++;
find(dha, dwa, dh, dw, da);
}
}
void left(int lha, int lwa, int lh, int lw, char la[][22])
{
lwa--;
if(lha<0||lwa<0||lha>=lh||lwa>=lw)
return ;
if(la[lha][lwa]=='.'){
la[lha][lwa]='#';
cnt++;
find(lha, lwa, lh, lw, la);
}
}
void right(int rha, int rwa, int rh, int rw, char ra[][22])
{
rwa++;
if(rha<0||rwa<0||rha>=rh||rwa>=rw)
return ;
if(ra[rha][rwa]=='.'){
ra[rha][rwa]='#';
cnt++;
find(rha, rwa, rh, rw, ra);
}
}
void find(int fha, int fwa, int fh, int fw, char fa[][22])
{
up(fha,fwa,fh,fw,fa);
down(fha,fwa,fh,fw,fa);
left(fha,fwa,fh,fw,fa);
right(fha,fwa,fh,fw,fa);
}
int main()
{
int h,w;
int hi,wi;
int ha,wa;
char a[22][22];
scanf("%d%d",&w,&h);
while(h!=0||w!=0){
cnt=1;
for(hi=0; hi<h; hi++){
scanf("%s",&a[hi]);
}
for(hi=0; hi<h; hi++){
for(wi=0; wi<w; wi++){
if(a[hi][wi]=='@'){
ha=hi;
wa=wi;
break;
}
}
if(a[hi][wi]=='@')
break;
}
find(ha,wa,h,w,a);
printf("%d\n",cnt);
scanf("%d%d",&w,&h);
}
return 0;
}