Total Submission(s): 815 Accepted Submission(s): 292
24 4*oooo###**#*ooo*4 4#****#****#*ooo#
35
开始时没思路,后来发现是经典的二分图匹配,好吧,还需要好好理解理解。
后来无限WA,历经千辛万苦,我发现是我精心设计的数组开小了。
我特么到底是怎么算的,才算了一个数,嗯,数组大小肯定不会超过这个数(本着节省内存的原则),
然后,match数组用了memset成-1,感觉,也是一个问题。(-1没有被卡)
还有,我特地用了short,因为数据都是50以内,50*50也才2500,也在short范围内,结果,我把所有的short改成int就AC了,这,我无语了
反正,很迷啊,看来被卡的应该就是short了,居然是short。。。short。。。醉
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <queue> using namespace std; int m, n, max_x, max_y; char map_ice[52][52]; int order_x[52][52], order_y[52][52]; bool graph[2501][2501]; bool vis[2501]; int match[2501]; bool find(int x) { int j; for (j = 1; j <= max_y; j++) { if (graph[x][j] == true && vis[j] == false) { vis[j] = true; if (match[j] == 0 || find(match[j])) { match[j] = x; return true; } } } return false; } void init() { memset(map_ice, 0, sizeof(char) * 52 * 52); memset(order_x, 0, sizeof(int) * 52 * 52); memset(order_y, 0, sizeof(int) * 52 * 52); memset(graph, 0, sizeof(bool) * 2501 * 2501); memset(vis, 0, sizeof(bool) * 2501); memset(match, 0, sizeof(int) * 2501); scanf("%d %d", &m, &n); for (int i = 0; i < m; i++) { scanf("%s", map_ice[i]); } for (int i = 0, t = 0; i < m; i++) { bool flag = false; for (int j = 0; j < n; j++) { if (map_ice[i][j] == '#') { if (flag) { order_x[i][j] = 0; flag = false; } } else if (map_ice[i][j] == '*') { if (flag) { order_x[i][j] = t; } else { flag = true; t++; order_x[i][j] = t; } } else if (map_ice[i][j] == 'o') { order_x[i][j] = 0; } } if (i == m - 1) max_x = t; } for (int i = 0, t = 0; i < n; i++) { bool flag = false; for (int j = 0; j < m; j++) { if (map_ice[j][i] == '#') { if (flag) { order_y[j][i] = 0; flag = false; } } else if (map_ice[j][i] == '*') { if (flag) { order_y[j][i] = t; } else { flag = true; t++; order_y[j][i] = t; } } else if (map_ice[j][i] == 'o') { order_y[j][i] = 0; } } if (i == n - 1) max_y = t; } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { graph[order_x[i][j]][order_y[i][j]] = true; } } } int main() { int T; scanf("%d", &T); while (T--) { int ans = 0; init(); for (int i = 1; i <= max_x; i++) { memset(vis, 0, sizeof(bool) * 2501); if (find(i)) ans += 1; } printf("%d\n", ans); } return 0; }