hdoj--1045<dfs&二分图最大匹配>(这里是dfs解法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045

题目描述: 在矩阵中放车,车可四面攻击,矩阵中有墙,可以防止攻击,给出墙的位置,输出最多可以放多少车;

题目要点:dfs&二分图最大匹配(匈牙利算法)(这里是dfs)

本题在一开始作的时候陷入了贪心的漩涡,写出来的以为是dfs、但实际上是谈心,而且贪心在这里是错误的;(贪心算法的应用范围比较窄,多数情况下是错误的)

然后发现了dfs与贪心的不同;贪心算法是每次放置车的方法都是固定,实际上并没有列举出所有的情况;dfs算法还是构建树,对于一个点,当不能放在这里的时候就dfs、他的下一个点,如果可以放在这里,并不是一定就要放在这里(这一点是和贪心算法区别最大的地方,谈心算法就是如果这里能放那就放这样影响了后面的防止情况,所以并没有列举出全部的情况),可以选择放,或者不放,如果放,就改变一下该点的状态,然后dfs下一个点,并在dfs结束时还原现场,即将状态改回来;如果选择不放就直接dfs下一个点(dfs的顺序是从上到下从左到右,如果跑到最右下角就结束);

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 char a[6][6];
 5 int maxn=0,n;
 6 bool check(int x,int y)//检查该点是否可以放;
 7 {
 8     for(int i=x-1;i>=0;i--)
 9     {
10         if(a[i][y]==‘X‘)
11             break;
12         if(a[i][y]==‘*‘)
13                 return false;
14     }
15     for(int i=y-1;i>=0;i--)
16     {
17         if(a[x][i]==‘X‘)
18             break;
19         if(a[x][i]==‘*‘)
20             return false;
21     }
22     return true;
23 }
24 void dfs(int x,int y,int count)
25 {
26     if(x>=n)
27         {
28             if(maxn<count)
29                 maxn=count;
30             return ;
31         }
32     if(y>=n)
33     {
34         dfs(x+1,0,count);
35     }
36     else
37     {
38         if(a[x][y]==‘.‘&&check(x,y))
39         {
40             a[x][y]=‘*‘;//修改现场;
41             dfs(x,y+1,count+1);
42             a[x][y]=‘.‘;//还原现场;
43         }
44         dfs(x,y+1,count);//这个地方是这个点不放的时候的情况;(及时可以放也要考虑不放的情况:);
45     }
46 }
47 int main()
48     {
49     while(cin>>n&&n)
50     {
51         for(int i=0;i<n;i++){
52             getchar();
53             scanf("%s",a[i]);
54         }
55 /*        printf("\n%d\n",n);
56         for(int i=0;i<n;i++){
57             for(int j=0;j<n;j++){
58                 printf("%c",a[i][j]);
59             }
60             printf("\n");
61         }*/
62         maxn=0;
63         dfs(0,0,0);
64         cout<<maxn<<endl;
65     }
66
67     return 0;
68 }

时间: 2025-01-02 15:38:21

hdoj--1045<dfs&二分图最大匹配>(这里是dfs解法)的相关文章

二分图最大匹配 hdoj 1045

题目:hdoj1045 题意:给出一个图,其中有 . 和 X 两种,. 为通路,X表示墙,在其中放炸弹,然后炸弹不能穿过墙,问你最多在图中可以放多少个炸弹? 分析:这道题目是在上海邀请赛的题目的数据简化版,数据水了,所以有很多方法,这里讲二分图最大匹配,题目难点在于建图 想到用暴力过,但是事实证明我想多了.然后又想到多重二分匹配,后来发现没有办法表示图中的行列中墙的阻隔,后来看了别人的建图,瞬间觉得高大上. 建图,首先把每一行中的可以放一个炸弹的一块区域标记为同一个数字,数字不重复,然后列做相同

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

hdoj 1045 Fire Net 【DFS】

题意:如果两个点要放在同一行或者同一列,那么两个点中间要有一个墙,否则的话只能放一个点,最后问你最多能放几个点. 看了一个星期.. 这道题的解法我还是第一次见,就是逐个逐个的来放置每个点,然后每经过一个点都判断一次,详情看代码 代码: #include <stdio.h> #include <string.h> int ans, n; char map[10][10]; int judge(int lin, int row) { int i; for(i = lin-1; i &g

DFS ZOJ 1002/HDOJ 1045 Fire Net

题目传送门 1 /* 2 题意:在一个矩阵里放炮台,满足行列最多只有一个炮台,除非有墙(X)相隔,问最多能放多少个炮台 3 搜索(DFS):数据小,4 * 4可以用DFS,从(0,0)开始出发,往(n-1,n-1)左下角走,x = cnt / n; y = cnt % n; 更新坐标, 4 直到所有点走完为止,因为从左边走到右边,只要判断当前点左上方是否满足条件就可以了 5 注意:当前点不能放炮台的情况也要考虑 6 g[x][y] == 'o'; 的错误半天才检查出来:) 7 */ 8 #inc

HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)

(点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配,那就直接匹配:如果Y中已经没有可以和x匹配的点(包括可以匹配的点已经被其他的x匹配),那就让已经匹配的y的原配x'寻找其他可以匹配的y’,并将y和x匹配,最后,统计出匹配的对数 (详细了解的话,可以看看这位的博客:https://blog.csdn.net/sunny_hun/article/de

hdoj 1010 Tempter of the Bone 【DFS】+【奇偶剪枝】

题意:从S出发到D停止,并且要在指定的时间t走到(不早不晚).注意,每个'.'只能走一次. 分析:DFS,但是用普通的dfs,TL, 所以要剪枝.我们可以想到,如果可以早到D点,但是D点周围有其他可以踩的点,并且可以观察到,从一个点(不是D点)到D点的距离(abs(x-dx)+abs(y-dy))是奇数的话,就要走奇数步,偶数的就走偶数步,() 代码: #include <stdio.h> #include <string.h> #include <stdlib.h>

图论——LCA、强联通分量、桥、割顶、二分图最大匹配、网络流

A: 交通运输线 时间限制: 5 Sec  内存限制: 128 MB 题目描述 战后有很多城市被严重破坏,我们需要重建城市.然而,有些建设材料只能在某些地方产生.因此,我们必须通过城市交通,来运送这些材料的城市.由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市之间没有道路.当然在运输线中,更不可能存在圈. 现在,你的任务来了.给你战后的道路情况,我们想知道,两个城市之间是否存在道路,如果存在,输出这两个城市之间的最短路径长度. 输入 第一行一个整数Case(Case<=10)表示测试数据

【Codevs1922】骑士共存问题(最小割,二分图最大匹配)

题意: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击. n<=200,m<=n^2 思路:经典的二分图最大匹配问题,采用黑白点染色的思想. 如果按照相邻点黑白不同染色,可以发现每次跳到的点必定与现在所在点不同色,二分图最大匹配即可. 这里用最小割来解决,因为不能允许任何黑白点之间的任何一条边有流量,符合最小割的思想. 1

二分图最大匹配总结

hdoj1528 二分匹配模版: 代码: 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 using namespace std; 7 #define N 220 8 9 int n, maps[N][N], vis[N], used[N]; 10 11 struct node 12 {