题意:
给个地图(最大4*4)..问能放多少个O...每个O是不能上下左右能看到的.(跟象棋的车一样...)..问最多能放多少个...
题解:
水题找手感...我的奇葩构图....对于当前(x,y)..若x左边有n1个墙...y上边有n2个墙..那么其映射的坐标为(x+10*n1,y+10*n2)....好吧...
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#define ll long long
#define MAXN 105
using namespace std;
int n,match[MAXN];
bool arc[MAXN][MAXN],used[MAXN];
char s[MAXN][MAXN];
bool dfs(int x)
{
int i;
for (i=1;i<=n;i++)
if (arc[x][i] && !used[i])
{
used[i]=true;
if (!match[i] || dfs(match[i]))
{
match[i]=x;
return true;
}
}
return false;
}
int getmax()
{
int sum=0;
memset(match,0,sizeof(match));
for (int i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
sum+=dfs(i);
}
return sum;
}
int main()
{
int i,j,k,ans;
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
while (~scanf("%d",&n) && n)
{
memset(arc,false,sizeof(arc));
for (i=1;i<=n;i++) scanf("%s",s[i]+1);
memset(arc,false,sizeof(arc));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (s[i][j]=='.')
{
int t1=i,t2=j;
for (k=1;k<j;k++)
if (s[i][k]=='X') t1+=10;
for (k=1;k<i;k++)
if (s[k][j]=='X') t2+=10;
// printf("-----%d %d-----\n",t1,t2);
arc[t1][t2]=true;
}
n=100;
printf("%d\n",getmax());
}
return 0;
}