杭电ACM1045——Fire Net~~深度优先搜索

题目的意思是:给你一个n * n 的地图,“X” 表示墙,“.” 表示空地。

然后需要在这个地图上面放置碉堡,不能放在同一行或者同一列,除非有墙挡着。

我们可以用递归来实现深搜,因为 n 最大为4。对于每一个可以放置碉堡的地方,我们有两种选择,一种就是放上去,标记一下,另一种就是不放,进行下一个位置的放置。

如何判断是否可以放置碉堡呢?这个只需要向该位置的四个方向进行搜索,先向下搜,直到遇到“X”或者出了边界,以此类推进行向上向左向右。但是如果遇到有之前标记过的,也就是放置了碉堡的(我标记的是“1”),就说明该位置不能放。

下面的是AC的代码:

#include <iostream>
using namespace std;

char map[5][5];
int n, max1;                                  //变量用max竟然CE,坑爹的OJ
int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};

void dfs(int ans)
{
	int i, j, k, flag;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
		{
			if(map[i][j] == '.')
			{
				int x, y; flag = 0;               //标记是否可以放置
				for(k = 0; k < 4; k++)            //四个方向
				{
					x = i + dir[k][0];
					y = j + dir[k][1];
					while(1)
					{
						if(x < 0 || x >= n || y < 0 || y >= n || map[x][y] == 'X')
							break;
						if(map[x][y] == '1')          //不能放
							flag = 1;
						x += dir[k][0];               //一直往同一个方向进行搜索
						y += dir[k][1];
					}
				}
				if(!flag)                          //可以放置
				{
					map[i][j] = '1';            //标记
					dfs(ans + 1);               //递归
					map[i][j] = '.';            //标记的复位
				}
			}
		}
	}
	if(max1 < ans)                //找最大碉堡数
		max1 = ans;
}

int main()
{
//	freopen("data.txt", "r", stdin);
	int i ,j;
	while(cin >> n && n)
	{
		getchar();
		for(i = 0; i < n; i++)
			for(j = 0; j < n; j++)
				cin >> map[i][j];
		max1 = 0;
		dfs(0);
		cout << max1 << endl;
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-26 06:02:08

杭电ACM1045——Fire Net~~深度优先搜索的相关文章

逆袭指数---杭电校赛(暴力搜索)

Problem Description 这依然是关于高富帅小明曾经的故事—— 尽管身处逆境,但小明一直没有放弃努力,除了搬砖,小明还研究过东方的八卦以及西方的星座,一直试图在命理上找到自己能够逆袭的依据. 当这些都失败以后,小明转向了数学研究,希望从中得到一些信息.一天,小明在研究<BestCoder逆袭的数理基础>这本书时,发现了宝贵的信息,其中写道:  每个人都存在一个逆袭指数,对于这个逆袭指数,可能存在连续的因子,如果这个连续因子足够长的话,那么这个人逆袭的概率就很大! 小明已知自己的逆

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

杭电 HDU ACM 1046 Tempter of the Bone

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 83458    Accepted Submission(s): 22740 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

杭电 2553 N皇后问题

http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8077    Accepted Submission(s): 3603 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不

杭电ACM题目分类

杭电ACM题目分类 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028. 1029.1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092. 1093.1094.1095.1096.1097.1098.1106.1108.1157.1163.1164.1170.1194.1196. 1197.1201.1202.1205.1219.1234.123

杭电1078(记忆搜索)

一道记忆搜索题,记忆搜索题就是搜索的形式+DP的思想! 题目: FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse has hid

杭电 1312 red and black

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8911    Accepted Submission(s): 5535 Problem Description There is a rectangular room, covered with square tiles. Each tile is color

杭电 1284

钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5446    Accepted Submission(s): 3106 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Outp