題意:
給個地圖(最大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 105using 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;}