#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<memory.h>
#include<cstdio>
#include<list>
#include<string>
#include<map>
#include<cmath>
#include <algorithm>
#include <queue>
#define NUM 30
#define maxint 10000000
#define INF 0x3f3f3f3f
#define Max 5001
using namespace std;
int c[NUM][NUM];//用邻接矩阵存储边和权
int dist[NUM];
char cMap[5][5];
int iBest;
int n;
bool CanPut(int row,int col);
void solve(int k , int current)
{
int x,y;
if(k==n*n)
{
if(current>iBest)
{
iBest = current;
return;
}
}
else
{
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);
}
}
bool CanPut(int row,int col)
{
int i ;
for(i = row-1;i>=0;i--)
{
if(cMap[i][col] == 'O')
return false;
if(cMap[i][col]=='X')
break;
}
for( i = col-1;i>=0;i--)
{
if(cMap[row][i] == 'O')
return false;
if(cMap[row][i]== 'X')
break;
}
return true;
}
int main()
{
freopen("in.txt", "r", stdin);
while(scanf("%d",&n)!=EOF && n!=0)
{
for(int i = 0;i<n;i++)
{
for(int j = 0;j<n;j++)
{
cin>>cMap[i][j];
}
}
iBest = 0;
solve(0, 0);
cout<<iBest<<endl;
}
}
ZOJ1002
最新推荐文章于 2019-03-07 11:21:00 发布