HDU 1045(炮台安置 DFS)

题意是在 n*n 的方格中进行炮台的安置,炮台不能处于同一行或同一列(类似于八皇后问题),但若是炮台间有墙壁阻挡,则可以同时安置这对炮台。问图中可以安放的最大炮台数目。

用深搜的方法,若此处为空地,则分四个方向继续向下,若直到搜到墙壁或图外也没有搜到已放置的炮台,则可以在当前位置添加炮台,继续向下,反之则不能添加炮台,求出最大的炮台数即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int dir[4][2] = {1,0,0,1,-1,0,0,-1};//{0,1,0,-1,1,0,-1,0};
 4 int n,flag,ans,newx,newy,mp[6][6];
 5 char s[6];
 6 void dfs(int sum)
 7 {
 8     if(sum > ans) ans = sum;
 9     for(int i = 1; i <= n; ++i)
10         for(int j = 1; j <= n; ++j)
11         {
12             if(mp[i][j] == 0)
13             {
14                 flag = 1;
15                 for(int k = 0; k < 4; ++k)
16                 {
17                     newx = i;
18                     newy = j;
19                     while(1)
20                     {
21                         newx += dir[k][0];
22                         newy += dir[k][1];
23                         if(mp[newx][newy] == 1||mp[newx][newy] == -1) break;
24                         else if(mp[newx][newy] == 2)
25                         {
26                             flag = 0;
27                             break;
28                         }
29                     }
30                  
31                 }   if(flag)
32                     {
33                         mp[i][j] = 2;
34                         dfs(sum+1);
35                         mp[i][j] = 0;
36                     }
37             }
38         }
39 }
40 int main()
41 {
42     while(~scanf("%d",&n)&&n)
43     {
44         memset(mp,-1,sizeof(mp));
45         for(int i = 1; i <= n; ++i)
46         {
47             scanf("%s",s+1);
48             for(int j = 1; j <= n; ++j)
49             {
50                 if(s[j] == '.') mp[i][j] = 0;
51                 else mp[i][j] = 1;
52             }
53         }
54         ans = 0;
55         dfs(0);
56         printf("%d\n",ans);
57     }
58     return 0;
59 }
View Code

 

转载于:https://www.cnblogs.com/Taskr212/p/9581191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值