题目链接:Click here~~
和这届蓝桥杯的一道代码填空题很相似。
题意:在一个方格中,放置尽量多的大炮,大炮如果在同行或同列,中间必须有墙相隔。
解题思路:深搜不解释。
#include <stdio.h>
char map[5][5];
int n,ans;
bool leagal(int x,int y)
{
bool have;
have = false;
map[x][y] = 'B';
for(int i=0;i<n;i++)
{
if(map[x][i] == 'B')
if(have)
return false;
else
have = true;
if(map[x][i] == 'X')
have = false;
}
have = false;
for(int i=0;i<n;i++)
{
if(map[i][y] == 'B')
if(have)
return false;
else
have = true;
if(map[i][y] == 'X')
have = false;
}
return true;
}
void Print()
{
puts("-----------");
for(int i=0;i<n;i++)
puts(map[i]);
puts("-----------");
}
void dfs(int x,int y,int cnt)
{
if(ans < cnt)
{
ans = cnt;
// Print();
}
if(y == n)
x++,y=0;
if(x == n)
return ;
if(map[x][y] == 'X')
dfs(x,y+1,cnt);
else
{
if(leagal(x,y))
dfs(x,y+1,cnt+1);
map[x][y] = '.';
dfs(x,y+1,cnt);
}
}
int main()
{
while(scanf("%d",&n),n)
{
ans = 0;
for(int i=0;i<n;i++)
scanf("%s",map[i]);
dfs(0,0,0);
printf("%d\n",ans);
}
return 0;
}