题目来源:Nyojhttp://acm.nyist.net/JudgeOnline/problem.php?pid=587
zojhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemI
#include <iostream>
#include <cstdio>
using namespace std;
char Graph[5][5];
int iMax, n;
bool CanPut(int row, int col)//判断该位置是否可以放置
{
for(int i = row-1; i >= 0; --i)//判断该列是否已经被放置
{
if(Graph[i][col] == 'O')//O表示已经放置
return false;
if(Graph[i][col] == 'X')
break ;
}
for(int i = col-1; i >= 0; --i)//判断该行是否放置
{
if(Graph[row][i] == 'O')
return false;
if(Graph[row][i] == 'X')
break ;
}
return true;
}
void DFS(int iPos, int kcount)//(iPos 是[0 , n*n-1] 看成一维的)
{
int x, y;
if(iPos == n*n)
{
if(kcount > iMax)
iMax = kcount;
return ;
}
else
{
x = iPos/n;//求该位置的横坐标
y = iPos%n;//该位置的纵坐标
if(Graph[x][y] == '.' && CanPut(x, y))
{
Graph[x][y] = 'O';
DFS(iPos+1, kcount+1);
Graph[x][y] = '.';//恢复现场
}
DFS(iPos+1, kcount);
}
}
int main()
{
while(scanf("%d", &n) && n)
{
iMax = 0;
for(int i = 0; i < n; ++i)
scanf("%s", Graph[i]);
DFS(0, 0);
printf("%d\n", iMax);
}
return 0;
}