“
1002 从一开始做ACM就郁闷的一道题,在1001下面它应该觉得压力很大啊!!哈哈。。
做完八皇后,党说这个能做了。。。
嘿嘿。这题是找放置最多数目的blockhouses(碉堡。。)使之不能同行同列,除非中间有个FIRENET。。。(同行同列就打中了。。)
开始想得比较复杂,按八皇后的思想,一行一行找,效果不好,一直不对,想明白了,一行不一定就放一个,一行也不一定放啊。。。当然,不放肯定全是防火墙了。。。
照党说的,全搜得了,原来是一行一行搜的,现在是一个一个搜,如果可以放(即满足条件),就标记。。。剩下的就是普通DFS做法了。
做完很有成就感 (*^__^*) 嘻嘻…… 终于把这个拿下了 /(^o^)/
”
#include<stdio.h>
char map[4][4];
int best,n;
int CanPut(int row, int col)
{
int i;
for (i = row - 1; i >= 0; i--)
{
if (map[i][col] == 'O' ) return 0;
if (map[i][col] == 'X' ) break;
}
for (i = col - 1; i >= 0; i--)
{
if (map[row][i] == 'O' ) return 0;
if (map[row][i] == 'X' ) break;
}
return 1;
}
//
void solve(int k,int tot)
{
int x,y;
if(k==n*n)
{
if(tot>best)
{
best=tot;
return;
}
}
else
{
x=k/n;
y=k%n;
if((map[x][y]=='.' ) && (CanPut(x,y) ) )
{
map[x][y]= 'O'; //这里总共只有两种选择
solve(k+1,tot+1); //SO这样写
map[x][y]= '.';
}
solve(k+1,tot);
}/
}
int main()
{
int i,j;
scanf( "%d",&n);
while(n>0)
{
for(i=0;i< n;i++)
for(j=0;j< n;j++)
scanf( "%1s",&map[i][j]);
best=0;
solve(0,0);
printf( "%d\n",best);
n=0;
scanf( "%d",&n);
}
return 0;
}