题目大意:
在一个正方形里,每门炮的射击方向是上下左右,炮不能击穿障碍物,请摆放最多门炮,使得其任意两门都不能互相攻击。
输出门数。
#include<iostream>
#include<string>
#include<cstring>
#define base 1000
using namespace std;
int maxn = 0;
int n;
char map[5][5];
bool visit[5][5];
bool isok(int x, int y) {
for (int i = x - 1; i >= 0; --i) {
if (visit[i][y]) return false;
if (map[i][y] == 'X') break;
}
for (int i = y - 1; i >= 0; --i) {
if (visit[x][i]) return false;
if (map[x][i] == 'X') break;
}
return true;
}
//这个dfs遍历是一个点一个点的遍历,所以在isok函数里面会冲突的只有以左上角(0,0)和当前节点(x,y)组成的矩形里面才会冲突
void dfs(int x, int y, int cost) {
if (cost>maxn) maxn = cost;
//要达到范围外第一点结束才能保证maxn正确
if (x*n+y == n*n) return;
int u = x * n + y;
int xx = (u + 1) / n;
int yy = (u + 1) % n;
//这是第一个位置没有限制的回溯,故要从第一个就开始判断
//也可以从主函数里面选择第一个点,然后以每一个点为第一点来回溯
//
if (map[x][y] == '.'&&isok(x,y)) {
visit[x][y] = true;
dfs(xx, yy, cost + 1);
visit[x][y] = false;
}
dfs(xx, yy, cost);
}
int main() {
while (cin >> n && n) {
maxn = 0;
memset(visit, false, sizeof(visit));
for (int i = 0; i<n; i++)
cin >> map[i];
dfs(0, 0, 0);
cout << maxn << endl;
}
return 0;
}
本文介绍了一种解决炮塔布局问题的算法实现。在正方形区域内放置炮塔,炮塔只能向上、下、左、右射击且不会穿透障碍物。通过递归搜索的方式寻找最多数量的炮塔布局方案。
8万+

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



