链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1045
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#problem/A
一看原题,先用搜索写一下,还是要学学匹配吧!
以前的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 10
#define INF 0x3f3f3f3f int n, ans;
char G[N][N]; bool judge(int x, int y)
{
int i; if(G[x][y]=='X')
return false; for(i=x; i>=; i--)
{
if(G[i][y]=='X')
break;
if(G[i][y]=='D')
return false;
} for(i=y; i>=; i--)
{
if(G[x][i]=='X')
break;
if(G[x][i]=='D')
return false;
}
return true;
} void DFS(int z, int k)
{
int x, y; x = z/n;
y = z%n; if(z==n*n)
{
ans = max(ans, k);
return ;
} if(judge(x, y))
{
G[x][y] = 'D';
DFS(z, k+);
G[x][y] = '.';
} DFS(z+, k);
} int main()
{
while(scanf("%d", &n),n)
{
int i; memset(G, , sizeof(G));
for(i=; i<n; i++)
scanf("%s", G[i]); ans = ;
DFS(, ); printf("%d\n", ans);
}
return ;
}
不懂什么意思,先贴上
匹配的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 105
#define INF 0x3f3f3f3f struct node{int x, y;}a[N][N]; int n, p[N], used[N], x, y, G[N][N];
char s[N][N]; int Find(int u)
{
for(int i=; i<=y; i++)
{
if(!used[i] && G[u][i])
{
used[i]=;
if(!p[i] || Find(p[i]))
{
p[i] = u;
return true;
}
}
}
return false;
} int main()
{
while(scanf("%d", &n),n)
{
int i, j; memset(s, , sizeof(s));
for(i=; i<n; i++)
scanf("%s", s[i]); x = y = ;
for(i=; i<n; i++)
for(j=; j<n; j++)
{
if(s[i][j]=='.')
{
if(j== || s[i][j-]=='X')
x++;
a[i][j].x = x;
}
if(s[j][i]=='.')
{
if(j== || s[j-][i]=='X')
y++;
a[j][i].y = y;
}
} memset(G, , sizeof(G));
for(i=; i<n; i++)
for(j=; j<n; j++)
{
if(s[i][j]=='.')
{
int u = a[i][j].x;
int v = a[i][j].y;
G[u][v] = ;
}
} int ans= ;
memset(p, , sizeof(p));
for(i=; i<=x; i++)
{
memset(used, , sizeof(used));
if(Find(i)==true)
ans++;
} printf("%d\n", ans);
}
return ;
}