ZOJ 1002
题目传送门
第一次写博客,代码功底很弱,写的很乱,这道题我的思路基本就是一个最大16层树的深度优先搜索,应用回溯法解决。
//方阵上数字为0代表空格,数字为1代表墙,数字为-1代表已经放了碉堡
#include<iostream>
#include<stdio.h>
using namespace std;
char input[4][4];
int in[4][4];
int NUM=0,Max_NUM=0;
void display(int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << in[i][j] << " ";
cout << endl;
}
cout << endl;
}
bool judge(int i, int j)//i为行,j为列
{
bool a1, a2, a;
if (in[i][j] == 1)
a = false;
else {
for (int k = i; k >= 0; k--) {
if (in[k][j] == 1)
{
a1 = true;
break;
}
if (in[k][j] == -1) {
a1 = false;
break;
}
if (k == 0 && in[k][j] == 0) {
a1 = true;
}
}
for (int k = j; k >= 0; k--) {
if (in[i][k] == 1)
{
a2 = true;
break;
}
if (in[i][k] == -1) {
a2 = false;
break;
}
if (k == 0 && in[i][k] == 0) {
a2 = true;
}
}
a = a1 & a2;
}
return a;
}
void backtrack(int n,int k)
{
int row, col;
row = k / n;
col = k % n;
if (k == n * n) {
if (Max_NUM < NUM)
Max_NUM = NUM;
}
else
{
if (judge(row, col)) {
in[row][col] = -1;
NUM++;
}
backtrack(n, k + 1);
if (in[row][col] == -1) {
in[row][col] = 0;
NUM--;
backtrack(n, k + 1);
}
}
}
int main() {
//freopen("input.txt", "r", stdin);
int N;//方针大小
cin >> N;
while (N)
{
Max_NUM = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cin >> input[i][j];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
if (input[i][j] == '.')
in[i][j] = 0;
else
in[i][j] = 1;
}
backtrack(N, 0);
cout << Max_NUM << endl;
cin >> N;
}
return 0;
}