题目大意:
这个是以前做过的一道DFS题目,当时是完全暴力写的。
给你一个N代表是N*N的矩阵,矩阵内 ‘X’代表墙, ‘.’代表通道。
问这个矩阵内最多可以放几个碉堡, 碉堡不能在同一行或者同一列,除非他们中间有墙。
 
二分图做法思想:我们用行去匹配列,判断最大匹配数。
我们需要重新构图, 假如一行中 (  ..X..X.. ) 那么在这一行中我们其实是可以分割到三个不同的行(因为中间隔有X)。然后对这个三个行进行编号。同理列也是一样的。当我们完全构好图后就可以做完全匹配了,其他的跟HDU 1083 Courses(最大匹配模版题) 差不多。
吐槽一下杭电,代码写好了提交用C++WA  G++过 妈蛋
 
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 50
bool G[maxn][maxn];///重新构图存储
bool vis[maxn];///标记点是否被遍历过
char maps[maxn][maxn];///地图存储
int P[maxn];///第 i 行匹配的第 P[i]列
int n, m, N;///重构图后是m行 n列
struct Node
{
int x, y;
}NodeInfo[maxn][maxn];///保存每个点重构图后所在的行和列 bool Find(int u)
{
for(int i=; i<n; i++)
{
if(G[u][i] && !vis[i])
{
vis[i] = true;
if( P[i] == - || Find(P[i]))
{
P[i] = u;
return true;
}
}
}
return false;
}
void MakeMaps()
{
m = , n = ;///行标记 和 列标记 for(int i=; i<N; i++)///第 i 行
{
for(int j=; j<N; j++)
{
if(maps[i][j] == '.')
NodeInfo[i][j].x = m;
if(maps[i][j+] == 'X' || maps[i][j+] == )
m ++;
}
} for(int i=; i<N; i++)///第 i 列
{
for(int j=; j<N; j++)
{
if(maps[j][i] == '.')
NodeInfo[j][i].y = n;
if(maps[j+][i] == 'X' || maps[j+][i] == )
n ++;
}
} for(int i=; i<N; i++)
{
for(int j=; j<N; j++)
{
int x = NodeInfo[i][j].x;
int y = NodeInfo[i][j].y; if(maps[i][j] == '.')
G[x][y] = true;
}
}
} int main()
{
while(scanf("%d", &N), N)
{ memset(G, , sizeof(G));
memset(P, -, sizeof(P));
memset(maps, , sizeof(maps)); for(int i=; i<N; i++)
scanf("%s", maps[i]); MakeMaps();
int ans = ;
for(int i=; i<m; i++)
{
memset(vis, false, sizeof(vis));
if( Find(i) )
ans ++;
}
printf("%d\n", ans);
}
return ;
}
 

HDU 1045 Fire Net(图匹配)的更多相关文章

  1. HDU 1045 Fire Net(行列匹配变形+缩点建图)

    题意:n*n的棋盘上放置房子.同一方同一列不能有两个,除非他们之间被墙隔开,这种话. 把原始图分别按行和列缩点 建图:横竖分区.先看每一列.同一列相连的空地同一时候看成一个点,显然这种区域不可以同一时 ...

  2. hdu 1045 Fire Net(二分匹配 or 暴搜)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏

    题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...

  4. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  5. HDU 1045 Fire Net 【连通块的压缩 二分图匹配】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    ...

  6. HDU 1045 Fire Net 二分图建图

    HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...

  7. HDU 1045(Fire Net)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...

  8. hdu 1045 Fire Net(最小覆盖点+构图(缩点))

    http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS     Memory Limit:32768KB   ...

  9. HDU 1045 Fire Net(dfs,跟8皇后问题很相似)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)   ...

  10. HDU 1045——Fire Net——————【最大匹配、构图、邻接矩阵做法】

    Fire Net Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

随机推荐

  1. Eclipse连接SVN服务器

    (1)安装 eclipse SVN 插件      插件名称 site-1.4.8.zip      Help --> SoftwareUpdates --->Find and Insta ...

  2. Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

    上文简介了HttpClient和Tomcatserver的交互,主角是HttpClient,然后它跟server交互有两种方式即get和post.所以这个HttpClient就相似于电脑上用的浏览器. ...

  3. STL源码剖析—stl_config

    操作系统:centos 6.4STL源码版本:3.3 前言:    要看一个项目的源码,首先要选中切入点.    那么在sgi stl 标准库中,其切入点是什么呢?    答案是:stl_config ...

  4. service redis does not support chkconfig的解决办法

    原文链接: http://my.oschina.net/maczhao/blog/322931 问题解决办法如下: 必须把下面两行注释放在/etc/init.d/redis文件靠前的注释中: # ch ...

  5. AS 2.0新功能 Instant Run

    Instant Run上手 作为一个Android开发者,很多的时候我们需要花大量的时间在bulid,运行到真机(虚拟机)上,对于ios上的Playground羡慕不已,这种情况将在Android S ...

  6. java学习第一阶段——面向对象

    你聪明有人会说你心机重, 你靠的是努力有人会说你运气好, 你说自己天生乐观有人会说你虚假, 有时候, 你明明就是一杯白水, 却被人硬生生逼成了满肚子憋屈的碳酸饮料. 人一生要遇见太多人, 即使有些话字 ...

  7. ORACLE_DBA管理脚本

    SYS @ prod >col index_name for a10 SYS @ prod >col table_name for a10 SYS @ prod >col start ...

  8. openssl提取pfx证书密钥对

    刚做银联的项目,对方给了1.pfx和1.cer两个测试文件,总结一下利用这两个文件提取出文本 银联提供两个测试证书  1.pfx 和 1.cer . 其中 pfx证书包含RSA的公钥和密钥;cer证书 ...

  9. linux术语解析(持续更新)

    1.linux内核有个版本,分别是 longterm: 提供长期支持的内核版本 stable: 稳定版本 Beta 测试版

  10. POJ 2230 (欧拉路)

    分析: 基础的欧拉路算法,变化在于要求每条边正向和反向各走一遍. 链式前向星构图,只要标记走过的单向边,边找边输出即可. code #include <iostream> #include ...