ZOJ-Fire Net

引用参考http://www.cnblogs.com/phinecos/archive/2008/09/18/1293017.html

深度优先遍历(递归)

 1 #include<iostream>
 2 using namespace std;
 3 
 4 //地图
 5 char map[4][4];
 6 //max最大值,n地图边
 7 int max=0,n=0;
 8 //记录每次的最大值,太小了oj不过
 9 int countmax[1000];
10 
11 //判断是否可以放置碉堡
12 bool CanPut(int row,int col)
13 {
14     //判断一列
15     for (int i = row - 1; i >= 0; i--)
16     {
17         if (map[i][col] == 'O') return false;
18         if (map[i][col] == 'X') break;
19     }
20 
21     //判断一行
22     for (int i = col - 1; i >= 0; i--)
23     {
24         if (map[row][i] == 'O') return false;
25         if (map[row][i] == 'X') break;
26     }
27     return true;
28 }
29 
30 //k当前第几格,curMax当前最大
31 int Solve(int k, int curMax)
32 {
33     int x = k / n;//
34     int y = k % n;//
35     if (k == n*n)
36     {
37         //判断当前最是否为最大
38         if (curMax > ::max)
39         {
40             ::max = curMax;
41             return 0;
42         }
43     }
44     else
45     {
46         //当前格为'.'并可以放置
47         if ((map[x][y] == '.' && (CanPut(x, y))))
48         {
49             //可以放置
50             map[x][y] = 'O';
51             //判断下一个
52             Solve(k + 1, curMax+1);
53             //回溯
54             map[x][y] = '.';
55         }
56         //当前格不能放置或回溯,判断下一个
57         Solve(k + 1, curMax);
58     }
59     return 0;
60 }
61 
62 int main()
63 {
64     int index = 0;
65     while ((cin >> n) && n)
66     {
67         //输入地图
68         for (int i = 0; i < n; i++)
69             for (int j = 0; j < n; j++)
70             {
71                 cin >> map[i][j];
72             }
73         //开始
74         Solve(0, 0);
75 
76         countmax[index++] = ::max;
77         ::max = 0;
78     }
79     for (int i = 0; i < index; i++)
80     {
81         cout << countmax[i] << endl;
82     }
83     //system("pause");
84     return 0;
85 }

 

转载于:https://www.cnblogs.com/miyamochio/p/9626463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值