Battle ships
http://acm.hdu.edu.cn/showproblem.php?pid=5093
注意数组大小, 因为分块所以要将匹配用到的数组开大点
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define ll long long #define ms(x) memset(x, 0, sizeof(x)) using namespace std; const int N = 53; int a[N][N], b[N][N]; int used[N*N], linked[N*N][N*N], match[N*N ]; char s[N][N]; int n, m; int p, q; void creat_line(){ p = 1; for(int i=0;i<n;i++){ bool f = 0; for(int j=0;j<m;j++){ if(s[i][j] =='*'){ a[i][j] = p; f = 1; } else if(s[i][j] == '#'){ if(j!=m-1) p++; f = 0; } } p++; } } void creat_col(){ q = 1; for(int j=0;j<m;j++){ bool f = 0; for(int i=0;i<n;i++){ if(s[i][j] =='*'){ b[i][j] = q; f = 1; } else if(s[i][j] == '#'){ if(i!=n-1) q++; f = 0; } } q++; } } bool found(int x){ for(int i=1;i<q;i++){ if(!used[i] && linked[x][i]){ used[i] = 1; if(match[i]==-1 || found(match[i])){ match[i] = x; return 1; } } } return 0; } void init(){ ms(a); ms(b); ms(linked); } int main() { int T; scanf("%d", &T); while(T--){ init(); scanf("%d%d", &n, &m); for(int i=0;i<n;i++){ scanf("%s", s[i]); } creat_col(); creat_line(); // for(int i=0;i<n;i++){ // for(int j=0;j<m;j++){ // printf("%d", a[i][j]); // } // printf("\n"); // } // for(int i=0;i<n;i++){ // for(int j=0;j<m;j++){ // printf("%d", b[i][j]); // } // printf("\n"); // } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i][j] == '*'){ linked[a[i][j]][b[i][j]] = 1; } } } memset(match, -1, sizeof(match)); int ans = 0; for(int i=1;i<p;i++){ ms(used); if(found(i)) ans++; } printf("%d\n", ans); } return 0; }