HDU ACM 4499 Cannon 暴力DFS

分析:N和M很小,直接暴力搜索即可。

#include<iostream>
using namespace std;    

#define N 6
#define M 6
int vis[N][M];     //有炮设为2,无炮为0,其他为1
int n,m,q,ans;

#define max(a,b) ((a)>(b)?(a):(b))

bool Valid(int i,int j)   //只需要判断当前和前面的即可(行列)
{
	int fg=0;
	int k;

	if(vis[i][j]==1)
		return false;
	for(k=i-1;k>=0;k--)       //行
		if(vis[k][j]==1)
			fg++;
		else if(vis[k][j]==2)
		{
			if(fg==1)
				return false;
			else
				fg++;
		}

	fg=0;             //列
	for(k=j-1;k>=0;k--)
		if(vis[i][k]==1)
			fg++;
		else if(vis[i][k]==2)
		{
			if(fg==1)
				return false;
			else
				fg++;
		}
	return true;
}

void DFS(int cnt,int x,int y)
{
	int i,j;

	for(i=x;i<n;i++)
		for(j=0;j<m;j++)
		{
			if(i==x && j<y)
				continue;
			if(Valid(i,j))
			{
				vis[i][j]=2;
				DFS(cnt+1,i,j+1);
				vis[i][j]=0;
			}
		}
	ans=max(ans,cnt);
}

int main()
{
	int a,b,i;

	ios::sync_with_stdio(false);
	while(cin>>n>>m>>q)
	{
		ans=0;
		memset(vis,0,sizeof(vis));
		for(i=0;i<q;i++)
		{
			cin>>a>>b;
			vis[a][b]=1;
		}
		DFS(0,0,0);
		cout<<ans<<endl;
	}
    return 0;
}
时间: 2024-11-03 21:58:54

HDU ACM 4499 Cannon 暴力DFS的相关文章

hdu 4499 Cannon 暴力dfs搜索

Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 589    Accepted Submission(s): 338 Problem Description In Chinese Chess, there is one kind of powerful chessmen called Cannon. It can move

HDU ACM 1015 Safecracker 暴力DFS

分析:暴搜,复杂度一次最高也才12^5. #include<iostream> #include<cmath> using namespace std; #define N 30 char s[15],ts[10],ans[10]; int tar,index[N]; bool vis[N]; void dfs(int d,int n) { int i,tmp; if(d==5) { tmp=index[ts[0]-'A']-pow(index[ts[1]-'A'],2)+pow(

hdu 4499 Cannon(暴力)

题目链接:hdu 4499 Cannon 题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击. 解题思路:枚举行放的情况,用二进制数表示,每次放之前推断能否放下(会不会和已经存在的棋子冲突),放下后推断会不会互相攻击的炮,仅仅须要对每一个新加入的炮考虑左边以及上边就能够了. #include <cstdio> #include <cstring> #include <algorithm&

HDU 3647 Tetris (暴力DFS)

题意:给你十个俄罗斯方块,问你能否拼成指定长宽的矩形,方块下落的顺序是严格确定的,后下落的方块不能落在先下落的方块之下. 每个俄罗斯方块都是由更小的小方格拼成的, 可以用一个一维数组来记录每一列已经摞上了多少个小方格.DFS遵循底部放满原则,如果可以恰好和已存在的方块实现无缝拼接才往上放,否则回溯. #include <iostream> #include <cstring> using namespace std; char tet[20]; //记录方块的下降次序 int bo

HDU 4499 Cannon (暴力搜索)

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

hdu 5024 Wang Xifeng&#39;s Little Plot【暴力dfs,剪枝】

2014年广州网络赛的C题,也是水题.要你在一个地图中找出一条最长的路,这条路要保证最多只能有一个拐角,且只能为90度 我们直接用深搜,枚举每个起点,每个方向进行dfs,再加上剪枝. 但是如果直接写的话,那一定会特别麻烦,再加上方向这一属性也是我们需要考虑的方面,我们将从别的地方到当前点的方向编一个号:往右为0,如下图顺时针顺序编号 (往右下方向为1,往下为2......以此类推) 我们知道了当前点的坐标,来到当前点的方向,以及到目前有没有拐弯,这几个属性之后,就可以记忆化搜索了,用一个四维数组

hdu4499 Cannon (DFS+回溯)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4499 Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 363    Accepted Submission(s): 214 Problem Des

HDU 1426 Sudoku Killer【DFS 数独】

自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会. 所以全球人民前仆后继,为了奖品日夜训练茶饭不思.当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的

HDU 1241 Oil Deposits --- 入门DFS

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1241 /* HDU 1241 Oil Deposits --- 入门DFS */ #include <cstdio> int m, n; //n行m列 char mapp[105][105]; /* 将和i,j同处于一个连通块的字符标记出来 */ void dfs(int i, int j){ if (i < 0 || j < 0 || i >= n || j >= m