HDU1281(1600)

xiaoxiao2021-02-28  98

小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么?

Input

输入包含多组数据, 第一行有三个数N、M、K(1

#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<string> using namespace std; int n, m, k; int mp[102][102], use[102], vis[102],xx[102*102],yy[102*102]; int zhao(int gen) { for (int a = 1; a <= m; a++) { if (!mp[gen][a])continue; if (vis[a])continue; vis[a] = 1; if (use[a] == 0 || zhao(use[a])) { use[a] = gen; return 1; } } return 0; } int xiongyali() { int fs = 0; memset(use, 0, sizeof(use)); for (int a = 1; a <= n; a++) { memset(vis, 0, sizeof(vis)); if (zhao(a))fs++; } return fs; } int main() { int tt = 0; while (cin >> n >> m >> k) { memset(use, 0, sizeof(use)); memset(mp, 0, sizeof(mp)); memset(vis, 0, sizeof(use)); int q, w; for (int a = 1; a <= k; a++) { scanf("%d%d", &q, &w); xx[a] = q, yy[a] = w; mp[q][w] = 1; } int qb = xiongyali(); int er = 0; for (int a = 1; a <= k; a++) { mp[xx[a]][yy[a]] = 0; int ew = xiongyali(); mp[xx[a]][yy[a]] = 1; if (ew < qb)er++; } printf("Board %d have %d important blanks for %d chessmen.\n", ++tt, er, qb); } }
转载请注明原文地址: https://www.6miu.com/read-49305.html

最新回复(0)