C,827799 522
打高尔夫球:
#define N for(
#define F(W,X,Y,Z) N i= W;i X Y;i Z)
#define C(A,B,C) if(c[A][B]==C)
#define S(W,X,Y,Z,A,B) p=1;F(W,X,Y,Z)C(A,B,120)p=0;if(p){F(W,X,Y,Z){C(A,B,46){c[A][B]='x';z++;Q();break;}}}else{F(W,X,Y,Z){C(A,B,120)break;else c[A][B]='o';}}
p,m,z,w,h,o,i,u,l,x,y;char c[16][16];Q(){N u=0;u<h;u++)N l=0;l<w;l++)if(c[u][l]=='o'){x=u;y=l;S(x,>,m,--,i,y)S(y,>,m,--,x,i)S(y,<,w,++,x,i)S(x,<,h,++,i,y)}}main(int a, char **v){h=atoi(v[1]);w=atoi(v[2]);N m=-1;o<h;o++)N i=0;i<w;i++)scanf("%c",&c[o][i]);Q();printf("%d",z);}
输入是通过高度和命令行参数来指定的,然后像这样在stdin上将网格作为单个字符串读取:./a.out 6 7 < input
其中输入是这种形式(从左到右,从上到下):
x..xxxxx..x--xx.xx--xx.ooo-.x.ooo-.xxxxxxx
“可读”:
#define F(W,X,Y,Z) for(i= W;i X Y;i Z)
#define C(A,B,C) if(c[A][B]==C)
#define S(W,X,Y,Z,A,B) p=1;F(W,X,Y,Z)C(A,B,120)p=0;if(p){F(W,X,Y,Z){C(A,B,46){c[A][B]='x';z++;Q();break;}}}else{F(W,X,Y,Z){C(A,B,120)break;else c[A][B]='o';}}
/*Example of an expanded "S" macro:
p=1;
for(i=x;i>m;i--) if(c[i][y]==120) p=0;
if(p)
{
for(i=x;i>m;i--)
{
if(c[i][y]==46)
{
c[i][y]='x';
z++;
Q();
break;
}
}
}
else
{
for(i= x;i > m;i --)
{
if(c[i][y]==120) break;
else c[i][y]='o';
}
}
*/
p,m,z,w,h,o,i,u,l,x,y;
char c[16][16];
Q(){
for(u=0;u<h;u++)
for(l=0;l<w;l++)
if(c[u][l]=='o')
{
x=u;y=l;
S(x,>,m,--,i,y)
S(y,>,m,--,x,i)
S(y,<,w,++,x,i)
S(x,<,h,++,i,y)
}
}
main(int a, char **v)
{
h=atoi(v[1]);
w=atoi(v[2]);
for(m=-1;o<h;o++)
for(i=0;i<w;i++)
scanf("%c",&c[o][i]);
P();
Q();
printf("%d\n",z);
P();
}
//Omitted in golfed version, prints the map.
P()
{
for(o=0;o<h;o++)
{
for (i=0;i<w;i++) printf("%c",c[o][i]);
printf("\n");
}
}
距离@Claudiu的解决方案还差得很远,但是它运行得非常快。它不是从边缘填充洪水,而是找到营地并从“ o”标记向外工作。
- 如果在营地旁边遇到任何不稳定的地面,它将在其上扩大营地。
- 如果网格上的任何营地在每个方向上都没有至少一堵墙,它会沿该方向移动,直到可以建造一堵墙为止。
- 放置每个新的墙部分后,将重复查找下一个要放置的墙部分。
样品墙放置:
x..xxxx x..xxxx
x..x--x x..xoox
x.xx--x x3xxoox
x.ooo-. <-- results in this --> xooooo1
x.ooo-. xooooo2
xxxxxxx xxxxxxx