dfs
题目大意
现在有一个N*N的地图,地图上有一些围墙。你的任务是在没有围墙的空白地方建尽可能多的炮台。
假设炮台可以向“上下左右”四个方向发射子弹,子弹可以穿越任何距离并可在途中摧毁一个另一个炮台。而墙壁结构坚固,可以阻止子弹。
现在你的目标是尽可能多地在地图中设置炮台,并且保证炮台不会互相摧毁。
题目思路
对于每一个点遍历,如果可以放置就作一个标记,如果不能放置就继续遍历下一个点。直到所有与点都被遍历。
#include<stdio.h>
int n,i,j,ans;
char s[5][5];
int c_put(int n,int m)
{
for(i=n-1;i>=0;i--)
{
if(s[i][m]=='O')
return 0;
if(s[i][m]=='X')
break;
}
for(j=m-1;j>=0;j--)
{
if(s[n][j]=='O')
return 0;
if(s[n][j]=='X')
break;
}
return 1;
}
void dfs(int k,int num)
{
int x,y;
if(k==n*n)
{
if(num>ans)
ans=num;
return ;
}
else
{
x=k/n;
y=k%n;
if(s[x][y]=='.'&&c_put(x,y))
{
s[x][y]='O';
dfs(k+1,num+1);
s[x][y]='.';
}
dfs(k+1,num);
}
}
int main()
{
while(~scanf("%d",&n)&&n)
{
ans=0;
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<n;j++)
scanf("%c",&s[i][j]);
}
dfs(0,0);
printf("%d\n",ans);
}
}