HDU-1045-fire net

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045

 

程序分析:

  题目是说在一个特殊的地图里摆设碉堡,限制条件可能跟N皇后又点相似,但是这里有墙,中间隔有墙的话还是不会互相干扰的。只是行列方向会冲突,斜角线不会冲突,。所以我们只有判断所在的行列不会存在冲突的碉堡就行。注意中间可以隔有墙。记住每一次到达最后一个点时的可放碉堡数,比现在保存最大的就替换为最大值。

解决方法:

  深搜回溯,找出每一种方法的最大放置碉堡数,编写一个判断能否放置碉堡的函数,细节看代码。  

 

 

View Code
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 int n, m;
 6 char map[5][5];
 7 int Max;
 8 
 9 int pd(int x, int y)
10 {
11     for(int i=x-1; i>=0; i--)   //判断此行能否放置碉堡
12     {
13         if(map[i][y] == '0') 
14             return 0;
15         if(map[i][y] == 'X')
16             break;
17     }
18     for(int j=y-1; j>=0; j--)   //判断此行能否放置碉堡
19     {
20         if(map[x][j] == '0')
21             return 0;
22         if(map[x][j] == 'X')
23             break;
24     }
25     return 1;
26 }
27 
28 void DFS(int k, int curmax)
29 {
30     int x, y;
31     if(k == n*n)  //到达最后一个点
32     {
33         if(Max < curmax)  //保存这一种方法最多能摆的碉堡数
34         {
35             Max = curmax;
36             return ;
37         }
38     }
39     else
40     {
41         x = k/n;
42         y = k%n;
43         if(map[x][y]=='.' && pd(x, y)==1) //可以摆放就把个数加一继续找下一个可以摆的地方
44         {
45             map[x][y] = '0';
46             DFS(k+1, curmax+1);
47             map[x][y] = '.';
48         }
49         DFS(k+1, curmax); //不能摆或者回溯回来进行下一个地方的查找
50     }
51 }
52 int main()
53 {
54     while(cin>>n && n)
55     { 
56         for(int i=0; i<n; i++)
57         {    
58             scanf("%s", map[i]);
59         }
60         Max = 0;
61         DFS(0, 0);
62         cout<<Max<<endl;
63     }
64     return 0;
65 }

 

转载于:https://www.cnblogs.com/ruihua852/archive/2012/08/31/2664885.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值