hdu 1045(dfs暴搜/缩点+二分图最大匹配(典型行列匹配题))
来源:互联网 发布:http 前端展示数据库 编辑:程序博客网 时间:2024/05/16 13:59
题目链接:Fire Net
题目大意:在一个方格图上放最多的大炮,指的每两个大炮(横竖)至少有一份blockhose将他们隔开
题目分析:
一、dfs暴搜
参见八皇后问题,(搜索其四个方向)判断每一个格子能不能放,能放,就标记为'@'
因为棋盘大小最多为4,所以不会TLE
#include <stdio.h>#include <memory.h>using namespace std;char g[5][5];int tot, sz, ans;int dx[] = { -1, 1, 0, 0 };int dy[] = { 0, 0, -1, 1 };bool check(int x, int y){ if (x<0 || x>sz - 1 || y<0 || y>sz - 1)return false; else return true;}bool judge(int x, int y){ bool flag = true; for (int i = 0; i<4; ++i){ if (!flag)return flag; int nx = x + dx[i]; int ny = y + dy[i]; while (check(nx, ny)){ if (g[nx][ny] == '@'){ flag = false; break; } else if (g[nx][ny] == 'X')break; nx = nx + dx[i]; ny = ny + dy[i]; } } return flag;}void dfs(int cur){ if (cur > ans)ans = cur; for (int i = 0; i < sz; ++i){ for (int j = 0; j < sz; ++j){ if (g[i][j] == '.'){ if (g[i][j] == '.'&&judge(i, j)) { g[i][j] = '@'; dfs(cur + 1);//放 g[i][j] = '.'; } } } }}int main(){ //freopen("in.txt", "r", stdin); while (scanf("%d", &sz) != EOF&&sz) { ans = 0; for (int i = 0; i < sz; ++i){ scanf("%s", g[i]); } dfs(0); printf("%d\n", ans); } return 0;}
二、二分图最大匹配
因为没有被墙隔开的只能放一个,因此按图所示,连续的空格可以缩成一个点
横着的点和竖着的点重合的地方都是可以放的,
相当于将横点和竖点匹配起来->二分图匹配
代码
#include <stdio.h>#include <memory.h>int sz;char str[5][5];int gRow[5][5], gCol[5][5],g[8][8];int nRow, nCol;bool vis[8];int link[8];int dfs(int u){ for (int v = 0; v < nCol; ++v){ if (g[u][v] == 1 && !vis[v]){ vis[v] = true; if (link[v] == -1 || dfs(link[v])){ link[v] = u; return 1; } } } return 0;}int hungry(){ int res = 0; memset(link, -1, sizeof(link)); for (int i = 0; i < nRow; ++i){ memset(vis, 0, sizeof(vis)); res += dfs(i); } return res;}int main(){ //freopen("in.txt", "r", stdin); while (scanf("%d", &sz) != EOF&&sz){ memset(gRow, -1, sizeof(gRow)); memset(gCol, -1, sizeof(gCol)); memset(g, -1, sizeof(g)); for (int i = 0; i < sz; ++i){ scanf("%s", str[i]); } nRow = 0, nCol = 0; for (int i = 0; i < sz; ++i){ for (int j = 0; j < sz; ++j){ if (str[i][j] == '.'){ int k; for (k = j; str[i][k] == '.'&&k < sz; ++k) { gRow[i][k] = nRow; } j = k; nRow++; } } } for (int j = 0; j < sz; ++j){ for (int i = 0; i < sz; ++i){ if (str[i][j] == '.'){ int k; for (k = i; str[k][j] == '.'&&k < sz; ++k){ gCol[k][j] = nCol; } i = k; nCol++; } } } for (int i = 0; i < sz; ++i){ for (int j = 0; j < sz; ++j){ if(str[i][j]=='.')g[gRow[i][j]][gCol[i][j]] = 1; } } printf("%d\n", hungry()); } return 0;}
0 0
- hdu 1045(dfs暴搜/缩点+二分图最大匹配(典型行列匹配题))
- 二分图(行列匹配)
- hdu 1045 dfs 二分匹配
- poj3041 最小点覆盖==二分图最大匹配 匈牙利算法求解最大匹配问题(运用DFS)
- hdu 1045 Fire Net 二分行列匹配
- hdu 1045 二分图最大匹配
- HDU 2819 Swap (二分图-行列匹配+输出解)
- HDU 2063 (二分图最大匹配)
- hdu 2119 Matrix 二分图匹配(最大匹配)
- hdu 1150 二分图 最小点覆盖=最大匹配
- hdu 1150 二分图最大匹配最小点覆盖
- HDU 1045 Fire Net(二分图最大匹配)
- HDU 1045 Fire Net(二分图最大匹配)
- 【HDU 2063】过山车(二分图最大匹配模板题)
- 二分匹配--行列匹配
- 二分图最大匹配(匈牙利算法-DFS增广模板)
- 【二分图匹配】最大匹配-匈牙利算法BFS && DFS写法
- HDU OJ 1281 棋盘游戏【二分图匹配之最大匹配重要点】
- LeetCode [363. Max Sum of Rectangle No Larger Than K] 难度[hard]
- vim常用指令
- h5 时间的控件
- linux 内核研究
- 欢迎使用CSDN-markdown编辑器
- hdu 1045(dfs暴搜/缩点+二分图最大匹配(典型行列匹配题))
- SpringMVC学习
- 一起来写web server 02 -- 多进程版本
- nginx编译安装 及 配置WEB服务
- Vue.js 2.0从入门到放弃---入门实例(二)
- 用*号搭建一个金字塔(python实现)
- DHT爬虫 原理分析
- Zend Studio 11 汉化补丁安装不行解决方案
- java 中的Scanner(详细讲解)