经典的回溯题。一次AC。
#include <stdio.h>
#define BLOCKHOUSE 'b'
void test(char cell, bool &bHasWall, bool &bValidToPutBlock)
{
if (cell == 'X')
{
bHasWall = true;
}
else if (cell == BLOCKHOUSE)
{
if (bHasWall == false)
{
bValidToPutBlock = false;
}
}
}
bool testValidToPutBlock(char *map, int n, int index)
{
int row = index / n;
int col = index % n;
bool bValidToPutBlock = true;
bool bHasWall = false;
for (int i = row - 1; bValidToPutBlock == true && bHasWall == false && i >= 0; i --)
{
test(map[i * n + col], bHasWall, bValidToPutBlock);
}
bHasWall = false;
for (int i = row + 1; bValidToPutBlock == true && bHasWall == false && i < n; i++)
{
test(map[i * n + col], bHasWall, bValidToPutBlock);
}
bHasWall = false;
for (int j = col - 1; bValidToPutBlock == true && bHasWall == false && j >= 0; j--)
{
test(map[row * n + j], bHasWall, bValidToPutBlock);
}
bHasWall = false;
for (int j = col + 1; bValidToPutBlock == true && bHasWall == false && j < n; j++)
{
test(map[row * n + j], bHasWall, bValidToPutBlock);
}
return bValidToPutBlock;
}
void dfs(char *map, int n, int index, int cnt, int &result)
{
if (index == n * n)
{
if (cnt > result)
{
result = cnt;
}
}
else
{
// not place blockhouse
dfs(map, n, index + 1, cnt, result);
// place blockhouse
if (map[index] == '.')
{
if (testValidToPutBlock(map, n, index) == true)
{
map[index] = BLOCKHOUSE;
dfs(map, n, index + 1, cnt + 1, result);
map[index] = '.';
}
}
}
}
int searchResult(char *map, int n)
{
int result = 0;
dfs(map, n, 0, 0, result);
return result;
}
int main()
{
int n;
while (scanf("%d", &n), n > 0)
{
getchar();
char *map = new char[n * n];
for (int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
map[i * n + j] = getchar();
}
getchar();
}
int ret = searchResult(map, n);
printf("%d\n", ret);
}
return 0;
}