zoj1002 fire net 。。dfs,用小媛话说:放在1001下面它应该压力很大啊!呵呵~~

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;
}
  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值