1、ZOJ1002-Fire Net
放置碉堡的深度优先搜索算法
//回溯算法,子集树
void solve(int k, int current)
{
int x, y;
if(k == n*n) //整个地图判断完毕
{ //更新最优解
if(current > iBest)
{iBest = current; return;}
}
else
{ //将单元数转换为xy坐标
x = k / n;
y = k % n;
if(cMap[x][y] == ‘.’ && CanPut(x, y)) //左子树
{
cMap[x][y] = 'O'; //放置一个碉堡
solve(k + 1, current + 1);
cMap[x][y] = ‘.’; //恢复现场
}
solve(k + 1, current); //不放置碉堡,右子树
}
}
//判断在行row和列col处能否配置碉堡
bool CanPut(int row, int col)
{
int i;
//判断col列上的合法性
for(i = row - 1; i >= 0; i--)
{
if(cMap[i][col] == 'O') return false;
if(cMap[i][col] == 'X') break;
}
//判断row行上的合法性
for(i = col - 1; i >= 0; i--)
{
if(cMap[row][i] == 'O') return false;
if(cMap[row][i] == 'X') break;
}
return true;
}