HDU ACM 1045 Fire Net 暴力搜索

分析:放过炮台的标记为‘ @ ‘(回溯要还原) 递归,下一次遍历时向四个方向延伸(一行或者一列),找到‘@‘ 则标记为不行,若找到‘X‘或边界则标记为行。

这题貌似还可以用二分匹配做。

#include<iostream>
using namespace std;

#define N 5
char map[N][N];
int dir[4][2]={-1,0,0,-1,1,0,0,1};
int n,max;

bool judge(int x,int y)
{
	int i,tx,ty;

	for(i=0;i<4;i++)
	{
		tx=x;
		ty=y;
		while(true)             //一直往外延伸
		{
    		tx=tx+dir[i][0];
    		ty=ty+dir[i][1];
	    	if(map[tx][ty]=='@')
	    		return false;
	    	else if(map[tx][ty]=='X')
		    	break;
	    	else if(tx< 1 || ty<1 || tx>n || ty>n)
	    		break;
		}
	}
	return true;
}

void dfs(int num)
{
	int i,j;

	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(map[i][j]=='.' && judge(i,j))
			{
				map[i][j]='@';
				dfs(num+1);
				map[i][j]='.';
			}
	if(max<num)      //得到最大值
		max=num;
}

int main()
{
	int i,j;

	while(cin>>n,n)
	{
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				cin>>map[i][j];
		max=0;
		dfs(0);
		cout<<max<<endl;
	}
    return 0;
}
时间: 2024-08-24 14:45:19

HDU ACM 1045 Fire Net 暴力搜索的相关文章

hdu 1399 Starship Hakodate-maru (暴力搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1399 题目大意:找到满足i*i*i+j*(j+1)*(j+2)/6形式且小于等于n的最大值. 1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 while(scanf("%d",&n),n) 10 { 11 int j,

hdu 4770 Lights Against Dudely 暴力搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4770 题目大意是让你放一些灯照亮一些房间 灯不可以照到某些特殊房间 但可以照出边界 灯光必须覆盖所有可以放灯的房间 求至少需要多少灯 搜索题 应该注意到冗长而无聊的题面中有告诉你最多只有15个可以放灯的房间 所以2^15来枚举 还应该注意到冗长而无聊的题面中有告诉你最多只有1个灯可以转向 所以还应该枚举哪个灯来转向 转向再枚举4个方向 然后判断是否成立 为了简化问题 单独把那些可放灯空间拿出来 最多

HDU 2616 Kill the monster (暴力搜索 || 终极暴力全排列)

题目链接:HDU 2616 Kill the monster 题意:有N个技能去打HP有M的怪兽,技能(A,M),技能伤害为A,当怪兽HP<=M时伤害为2*A.求打死怪兽(HP<=0)用的最少技能 方法一:将技能全排列,计算伤害,得到答案. 方法二:搜索,具体看代码. 全排列AC代码: #include<stdio.h> #include<algorithm> using namespace std; struct node { int p,v; }; struct n

HDU ACM 5254 棋盘占领-&gt;暴力枚举

分析:暴力,注意有公共点是指两个城池是否相邻. #include<iostream> #include<vector> using namespace std; bool map[505][505]; vector<int> vx; vector<int> vy; int n,m; bool judge(int x,int y) { bool t1,t2,t3,t4; t1=t2=t3=t4=0; if(x>1 && map[x-1][

HDU ACM 4414 Finding crosses 暴力枚举

分析:一个图,求图中'#'组成了多少个十字架,注意十字架的宽度是奇数.对每个'#'判断,上下左右 ,步长为1 ,2,...25是不是都符合条件,符合的话判断个数为奇数即可. #include<iostream> using namespace std; #define N 50 char map[N][N]; int dir[4][2]={ {-1,0}, {0,-1}, {1,0}, {0,1}}; int n,ans; bool valid(int x,int y) { return x&

HDU 1045 Fire Net 状压暴力

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8073    Accepted Submission(s): 4626 Problem Description Suppose that we have a squar

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

http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1045 Description Suppose that we have a square city with straight streets. A map of a city

HDU 1045 - Fire Net (最大独立集)

题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝.最后取可以放置的最大值. 这里我转化成求最大独立集来做. 首先将每个空地编号,对于每个空地,与该位置可以攻击到的空地连边.找最多的空地使得不互相攻击,即求该图的最大独立集.与搜索做法基本一致,但是说法略有不同. 1 #include<iostream> 2 #include<cstring

ACM 暴力搜索题 题目整理

UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include