栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1358 Housing Complexes

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1358 Housing Complexes

#include <stdio.h>#include <string.h>#include <stdlib.h>#define CY 60#define E 3000struct re {int v, nxt;}e[E];char str[CY][CY];int C[27][CY][CY], g[CY], m2[CY];bool vis[CY], vst[CY][CY];int K, N, M, H, W, idx;void init() {idx = 0;memset(g, -1, sizeof(g));}void addedge(int u, int v) {e[idx].v = v;e[idx].nxt = g[u]; g[u] = idx++;}int calc(int k, int i, int j) {return C[k][i - 1][j] + C[k][i][j - 1] - C[k][i - 1][j - 1] + 1;}void get_sum(int n, int m) {memset(C, 0, sizeof(C));for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {int u = str[i][j] - 'A';for (int k = 0; k < 27; ++k) {if (str[i][j] == '0') C[k][i][j] = calc(k, i, j);else {C[k][i][j] = calc(k, i, j);if (u != k) C[k][i][j]--;} }}}}int cal(int u, int i, int j) {return C[u][i][j] - C[u][i - H][j] - C[u][i][j - W] + C[u][i - H][j - W];}bool can(int u) {int area = H * W;for (int i = H; i <= N; ++i) {for (int j = W; j <= M; ++j) {if (cal(u, i, j) == area) {return true;}}}return false;}bool path(int u) {for (int i = g[u]; ~i; i = e[i].nxt) {int v = e[i].v;if (!vis[v]) {vis[v] = true;if (-1 == m2[v] || path(m2[v])) {m2[v] = u;return true;}}}return false;}int MaxMatch(int n) {memset(m2, -1, sizeof(m2));int res = 0;for (int i = 0; i < n; ++i) {memset(vis, false, sizeof(vis));if (path(i)) res++;}return res;}void print(int n, int m) {for (int i = 1; i <= N; ++i) {for (int j = 1; j <= M; ++j) {if (j > 1) putchar(' ');printf("%d", C[1][i][j]);}puts("");}}int main(void) {int cas;scanf("%d", &cas);for (int Cas = 1; Cas <= cas; ++Cas) {scanf("%d%d%d%d%d", &K, &N, &M, &H, &W);init();memset(vst, false, sizeof(vst));int sum = 0;for (int k = 0; k < K; ++k) {for (int i = 1; i <= N; ++i) {scanf("%s", str[i] + 1);}get_sum(N, M);if (can(26)) sum++;else {for (int i = 0; i < 26; ++i) {if (can(i)) vst[i][k + 26] = true;}}}for (int i = 0; i < CY; ++i) {for (int j = 0; j < CY; ++j) {if (vst[i][j]) addedge(i, j);}}sum += MaxMatch(26);printf("%dn", sum);}return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379711.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号