题目链接:hdu 4499 Cannon

题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击。

解题思路:枚举行放的情况,用二进制数表示,每次放之前推断能否放下(会不会和已经存在的棋子冲突),放下后推断会不会互相攻击的炮,仅仅须要对每一个新加入的炮考虑左边以及上边就能够了。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int N = 10;
int c, si[N*5]; inline int bitCount(int x) {
return x == 0 ? 0 : bitCount(x/2) + (x&1);
} void mkdir() {
c = 0;
for (int i = 0; i < (1<<5); i++) {
if (bitCount(i) <= 3)
si[c++] = i;
}
} int n, m, k, ans, g[N][N], tp; void init () {
memset(g, 0, sizeof(g));
ans = 0;
tp = (1<<m)-1;
int x, y;
for (int i = 0; i < k; i++) {
scanf("%d%d", &x, &y);
g[x][y] = 1;
}
} inline bool judgeSet(int d, int s) {
for (int i = 0; i < m; i++)
if ((s&(1<<i)) && g[d][i])
return false;
return true;
} inline void Set(int d, int s, int val) {
for (int i = 0; i < m; i++)
if (s&(1<<i))
g[d][i] = val;
} inline bool checkup(int x, int y) {
int flag = 0;
for (int i = x - 1; i >= 0; i--) {
if (flag && g[i][y] == 2)
return true;
else if (flag && g[i][y] == 1)
return false;
else if (g[i][y])
flag = 1;
}
return false;
} inline bool checklf(int x, int y) {
int flag = 0;
for (int i = y - 1; i >= 0; i--) {
if (flag && g[x][i] == 2)
return true;
else if (flag && g[x][i] == 1)
return false;
else if (g[x][i])
flag = 1;
}
return false;
} bool judgeOk(int d) {
for (int i = 0; i < m; i++) {
if (g[d][i] == 2) {
if (checkup(d, i))
return false;
if (checklf(d, i))
return false;
}
}
return true;
} void dfs(int d, int cnt) { if (ans >= (n-d)*3+cnt)
return; if (d >= n) {
ans = max(ans, cnt);
return;
} for (int i = 0; i < c; i++) { if (si[i] > tp)
continue; if (judgeSet(d, si[i])) {
Set(d, si[i], 2); if(judgeOk(d)) {
dfs(d+1, cnt + bitCount(si[i]));
} Set(d, si[i], 0);
}
}
} int main () {
mkdir();
while (scanf("%d%d%d", &n, &m, &k) == 3) {
init();
dfs(0, 0);
printf("%d\n", ans);
}
return 0;
}

hdu 4499 Cannon(暴力)的更多相关文章

  1. HDU 4499 Cannon (暴力求解)

    题意:给定一个n*m个棋盘,放上一些棋子,问你最多能放几个炮(中国象棋中的炮). 析:其实很简单,因为棋盘才是5*5最大,那么直接暴力就行,可以看成一行,很水,时间很短,才62ms. 代码如下: #i ...

  2. HDU 4499 Cannon (暴力搜索)

    题意:在n*m的方格里有t个棋子,问最多能放多少个炮且每一个炮不能互相攻击(炮吃炮) 炮吃炮:在同一行或同一列且中间有一颗棋子. #include <stdio.h> #include & ...

  3. hdu 4499 Cannon dfs

    Cannon Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4499 D ...

  4. HDU 4499.Cannon 搜索

    Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  5. HDU 4499 Cannon (搜索)

    Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  6. HDU 5091---Beam Cannon(线段树+扫描线)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...

  7. HDU 5510 Bazinga 暴力匹配加剪枝

    Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5510 ...

  8. HDU 5522 Numbers 暴力

    Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5522 ...

  9. hdu 5077 NAND(暴力打表)

    题目链接:hdu 5077 NAND 题目大意:Xiaoqiang要写一个编码程序,然后依据x1,x2,x3的值构造出8个字符.如今给定要求生成的8个字符.问 说Xiaoqiang最少要写多少行代码. ...

随机推荐

  1. Asp.Net 母版页

    背景:回顾下以前用到过的asp.net控件 介绍: 使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局.单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为.然后可以创建 ...

  2. 新修改了EMA的计算方法,合并线性回归率的计算。和通达信的结果一模一样

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  3. PAT-1041 Be Unique

    Being unique is so important to people on Mars that even their lottery is designed in a unique way. ...

  4. POJ 1240 Pre-Post-erous! 解题报告

    题意: 给出一个m叉树的前,后序遍历求这样的树有多少种. Solution: 我们知道前序遍历的第一个点一定是根节点,后序遍历的最后一个点一定是根节点. 由此,我们只一要确定对于每一个节点,它有多少个 ...

  5. 将CSS CLIP属性应用在:扩展覆盖效果

    我们想要展示如何利用CSS3 clip属性制作一种简单而整洁的扩展效果,当点击一个box元素时实现平稳过渡.这个想法是为了实现某种叠加效果,好像它实际上在各个元素的下面.点击其中一个元素将创建一个切断 ...

  6. [FindBugs分析记录]Class defines clone() but doesn't implement Cloneable

    官网解释: This class defines a clone() method but the class doesn't implement Cloneable. There are some ...

  7. RemoteWebDriver使用说明

    1. 本地代码使用RemoteWebDriver启动: public class Testing { public void myTest()throws Exception { WebDriver ...

  8. 3 Longest Substring Without Repeating Characters(最长不重复连续子串Medium)

    题目意思:求字符串中,最长不重复连续子串 思路:使用hashmap,发现unordered_map会比map快,设置一个起始位置,计算长度时,去减起始位置的值 eg:a,b,c,d,e,c,b,a,e ...

  9. winform下调用webservice,传参List<string>

    用c#做了一个webservice,其中一个接口是public bool AddReturns(List<string> SQLStringList). 然后在另一个c#做的winform ...

  10. 织梦DedeCms用SQL语句调用数据库任意内容

    dedecms多站点数据利用SQL句段进行互相调用数据方法:2个或者多个DEDE的站怎么互相调用数据,非JS调用,前提是2个或者多个dedecms站点都安装的同一个数据库的不同数据表内,才能实现功能. ...