“
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;
}
本文分享了一位程序员如何通过调整思路,从复杂到简单地解决了一个ACM竞赛难题。主要关注如何在棋盘上放置最多的碉堡,使得它们不能同行同列,除非有防火墙作为缓冲。通过采用深度优先搜索(DFS)算法,作者最终成功解决了问题,并实现了代码实现。

被折叠的 条评论
为什么被折叠?



