/**
* @name: zoj 1002
* @time: 2014/10/11
* by Ting
*/
/* 回溯+遍历
*/
#include <iostream>
#include <vector>
const int MAX = 4;
int ans;
/* @func: search
* @brief: 遍历所有情况,得到最大的可放节点数。
* @param: arr --记录着该城市防火墙分布的矩阵
* row --记录某一行是否可以访问
* col --记录某一列是否可以访问
* size --矩阵大小
* ptr --遍历到第几行
* count--可放的节点数
* @return: null
*/
void search(char arr[][MAX], std::vector<int> row, std::vector<int> col, int size, int ptr, int count) {
if (ans < count) {
ans = count;
}
if (ptr >= size) {
return;
}
for (int j = 0; j < size; j++) {
int tmp = count;
std::vector<int> tmpRow = row, tmpCol = col;
for (int i = j; i < size; i++) {
// 若果节点可以访问,就访问,并且同一行,同一列的节点就不可以访问
if (tmpRow[ptr] && tmpCol[i]) {
if (arr[ptr][i] == '.') {
tmpRow[ptr] = tmpCol[i] = 0;
tmp++;
}
}
// 若果该节点是'X',其同一行右方,同一列下方的节点可以访问,自己手动运算一下就很清楚了
if (arr[ptr][i] == 'X') {
tmpRow[ptr] = tmpCol[i] = 1;
}
}
// 遍历下一行
search(arr, tmpRow, tmpCol, size, ptr + 1, tmp);
}
}
int main() {
int size;
char city[MAX][MAX];
std::vector<int> row, col;
while (std::cin >> size && size != 0) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
std::cin >> city[i][j];
}
}
for (int i = 0; i < MAX; i++) {
row.push_back(1);
col.push_back(1);
}
ans = 0;
search(city, row, col, size, 0, 0);
std::cout << ans << std::endl;
}
return 0;
}
zoj Fire Net
最新推荐文章于 2019-09-14 08:56:00 发布