Cannon

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 965    Accepted Submission(s): 556

Problem Description
In Chinese Chess, there is one kind of powerful chessmen called Cannon. It can move horizontally or vertically along the chess grid. At each move, it can either simply move to another empty cell in the same line without any other chessman along the route or perform an eat action. The eat action, however, is the main concern in this problem. 
An eat action, for example, Cannon A eating chessman B, requires two conditions: 
1、A and B is in either the same row or the same column in the chess grid. 
2、There is exactly one chessman between A and B. 
Here comes the problem. 
Given an N x M chess grid, with some existing chessmen on it, you need put maximum cannon pieces into the grid, satisfying that any two cannons are not able to eat each other. It is worth nothing that we only account the cannon pieces you put in the grid, and no two pieces shares the same cell.
 
Input
There are multiple test cases. 
In each test case, there are three positive integers N, M and Q (1<= N, M<=5, 0<=Q <= N x M) in the first line, indicating the row number, column number of the grid, and the number of the existing chessmen. 
In the second line, there are Q pairs of integers. Each pair of integers X, Y indicates the row index and the column index of the piece. Row indexes are numbered from 0 to N-1, and column indexes are numbered from 0 to M-1. It guarantees no pieces share the same cell.
 
Output
There is only one line for each test case, containing the maximum number of cannons.
 
Sample Input
4 4 2
1 1 1 2
5 5 8
0 0 1 0 1 1 2 0 2 3 3 1 3 2 4 0
 
Sample Output
8
9
 
 
题意:在n×m的棋盘上面有Q的棋子,它们之间不可以相互吃对方。现在要在棋盘上面增加棋子“炮”,问最多可以增加多少个炮使得炮之间不能相互吃对方(1<= N, M<=5, 0<=Q <= N x M)。炮a吃棋子b的规则是,a和b在一行或者一列,a和b之间有一个棋子。
 
思路:n和m很小,直接暴力BFS搜索。注意炮可以增加的规则。
 
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int ans=;
int edge[][];
int dfs(int x,int y,int cou)
{
int i,j,t,sign,ok;
/*
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
cout<<edge[i][j]<<" ";
cout<<endl;
}
cout<<endl;
*/
if(cou>ans) ans=cou;
edge[x][y]=;
/**当前行可以增加*/
for(j=y+; j<n; j++)
{
if(edge[x][j]==) continue;
sign=;
ok=;
for(t=j-; t>=; t--)
{
if(edge[x][t]!=) sign++;
if(sign==&&edge[x][t]==)
{
ok=;
break;
}
}
if(ok==)
{
sign=;
for(t=x-; t>=; t--)
{
if(edge[t][j]!=) sign++;
if(sign==&&edge[t][j]==)
{
ok=;
break;
}
}
if(ok==)
{
edge[x][j]=;
dfs(x,j,cou+);
edge[x][j]=;
}
}
}
/**当前行不能增加,加入后面的行*/
for(i=x+; i<n; i++)
{
for(j=; j<m; j++)
{
if(edge[i][j]==) continue;
sign=;
ok=;
for(t=i-; t>=; t--)
{
if(edge[t][j]!=) sign++;
if(sign==&&edge[t][j]==)
{
ok=;
break;
}
}
if(ok==)
{
edge[i][j]=;
dfs(i,j,cou+);
edge[i][j]=;
}
}
}
}
int main()
{
int i,j,q;
int x,y;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
memset(edge,,sizeof(edge));
while(q--)
{
scanf("%d%d",&x,&y);
edge[x][y]=;
}
ans=;
for(i=; i<n; i++)
for(j=; j<m; j++)
if(edge[i][j]==)
{
edge[i][j]=;
dfs(i,j,);
edge[i][j]=;
}
cout<<ans<<endl;
}
return ;
}

HDU 4499.Cannon 搜索的更多相关文章

  1. hdu 4499 Cannon(暴力)

    题目链接:hdu 4499 Cannon 题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击. 解题思路:枚举 ...

  2. HDU 4499 Cannon (搜索)

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

  3. HDU 4499 Cannon (暴力搜索)

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

  4. hdu 4499 Cannon dfs

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

  5. HDU 4499 Cannon (暴力求解)

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

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

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

  7. hdu 5468(莫比乌斯+搜索)

    hdu 5468 Puzzled Elena   /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5   Sample Output Case #1: ...

  8. HDU 1045 (DFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...

  9. HDU 1180 (BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...

随机推荐

  1. 配置Ubuntu虚拟环境

    1.ubuntu默认root用户没有激活,激活root用户,就要为root用户创建密码 $sudo passwd root   2.修改主机名 $vi /etc/hostname   3.安装ssh服 ...

  2. python中函数的参数

    函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...

  3. centos已经安装了libestr但在安装libee时却提示未安装

    在loganalyzer+rsyslog日志分析错误总结;

  4. 3. 修改myeclipse工作区间默认编码和jsp的默认编码

    1.windows - preferences - General - Workspace 2.windows - preferences - MyEclipse - Files and Editor ...

  5. HTML5 Canvas ( 线段的绘制 ) beginPath, moveTo, strokeStyle, stroke

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. eclipse override报错

    转自:https://www.cnblogs.com/libra0920/p/6408891.html 错误: 在 eclipse 的新工作空间开发项目时,出现大面积方法编译错误.鼠标放在方法名上后显 ...

  7. 使用seaborn制图(箱型图)

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 设置风格, ...

  8. Windows下MySQL5.6查找my.ini配置文件

    在DOS命令行窗口登录MySQL,输入如下命令查看MySQL的安装目录和数据存放目录,MySQL的配置文件就在数据存放目录下: 另外一种方法: 在"开始 → 所有程序 → MySQL&quo ...

  9. Eclipse 更改Maven项目名

    1. 在Eclipse 中修改项目名 没错这种方法跟你预料的一样简单,当项目已经导入到 Eclipse 之后,只需要做两个事情 1.1 改项目文件夹名称 选中项目,按 F12 ,改名. 多数人改项目名 ...

  10. ios 确定文字所占矩形框大小

    labelFrame.size = [self.label.text sizeWithFont:self.label.font constrainedToSize:CGSizeMake(self.la ...