炮兵阵地

escription

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 


如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 

Input

第一行包含两个由空格分割开的正整数,分别表示N和M; 
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。

Output

仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。

Sample Input

5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output

6
 

AC

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxr 110
#define maxc 15
#define maxm 70
#define CL(a) memset(a,0,sizeof(a))
bool legal(int a, int b){ return a&b; }
int row, col;
int nums;
int base[maxr];
int state[maxm], soldier[maxm];
int dp[maxr][maxm][maxm];//第i行为j状态,i-1行为k状态,最大炮兵个数dp[i][j][k]
int main()
{
	//freopen("in.txt", "r", stdin);
	CL(base); CL(state); CL(soldier); CL(dp);
	nums = 0;
	char str[2][maxc];
	scanf("%d %d", &row, &col);
	for (int i = 0; i < row; i++)  //将地图转换成二进制
	{
		scanf("%s", str[0]);
		for (int j = 0; j < col;j++)
		if (str[0][j] == 'H') base[i] += 1 << j;
	}
 
	for (int i = 0; i < (1<<col); i++){  //确立仅仅是两个炮兵互不攻击的状态
		if (legal(i, i << 2) || legal(i, i << 1)) continue; //dont forget case: d=1
		int k = i;
		while (k){
			soldier[nums] += k & 1;
			k = k >> 1;
		}
		state[nums++] = i;
	}
 
	for (int i = 0; i < nums; i++)  //初始化
	{
		if (legal(state[i], base[0])) continue; //去除炮兵在山上的
		dp[0][i][0] = soldier[i];
	}
 
	for (int r = 1; r < row; r++)  //每一行
	{
		for (int i = 0; i < nums; i++)  //第i行状态
		{
			if (legal(state[i], base[r])) continue; //去除炮兵在山上的
			for (int j = 0; j < nums; j++) //第i-1行状态
			{
				if (legal(state[j], base[r-1])) continue; //去除炮兵在山上的
				if (legal(state[i], state[j])) continue;  //除去上下两行相互攻击
				for (int k = 0; k < nums; k++) //第i-2行状态
				{
					if (r - 2 >= 0 && legal(state[k], base[r - 2])) continue; //去除炮兵在山上的
					if (legal(state[i], state[k])) continue;  //除去上下两行相互攻击
					if (legal(state[j], state[k])) continue;  //除去上隔一行下两行相互攻击
					dp[r][i][j] = max(dp[r][i][j], dp[r - 1][j][k] + soldier[i]);
				}
			}
		}
	}
	int ans = 0;
	for (int i = 0; i < nums; i++)
	for (int j = 0; j < nums; j++)
		ans = max(ans, dp[row - 1][i][j]);
	printf("%d\n", ans);
	return 0;
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用 JavaScript 编写的杀死幽灵游戏(附源代码) 杀死鬼魂游戏是使用 Vanilla JavaScript、CSS 和 HTML 画布开发的简单项目。这款游戏很有趣。玩家必须触摸/杀死游荡的鬼魂才能得分。您必须将鼠标悬停在鬼魂上 - 尽量得分。鬼魂在眨眼间不断从一个地方移动到另一个地方。您必须在 1 分钟内尽可能多地杀死鬼魂。 游戏制作 这个游戏项目只是用 HTML 画布、CSS 和 JavaScript 编写的。说到这个游戏的特点,用户必须触摸/杀死游荡的幽灵才能得分。游戏会根据你杀死的幽灵数量来记录你的总分。你必须将鼠标悬停在幽灵上——尽量得分。你必须在 1 分钟内尽可能多地杀死幽灵。游戏还会显示最高排名分数,如果你成功击败它,该分数会在游戏结束屏幕上更新。 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要玩游戏,首先,单击 index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值