HDU4499 Cannon DFS 回溯的应用

题意就是给你一个n*m的棋盘,然后上面已经有了 棋子,并给出这些棋子的坐标,但是这些棋子是死的就是不能动,然后让你在棋盘上面摆炮,但是炮之间不能互相吃,吃的规则我们斗懂得 炮隔山打嘛,问你最多能放几个炮

肯定是搜索了,n,m最大才5,可能挺久没做了,对于回溯反而把握不好了,写了好久调试了好久,才过

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <set>
#include <queue>
#include <stack>
#define INF 999999999
#define eps 0.00001
#define LL long long
#define maxn 1000005
using namespace std;

int mp[10][10];
int tmp[10][10];

int n,m,q;
int ans ;

void init() {
	memset(mp,0,sizeof(mp));
}

int cal(int x,int y) {
	if(mp[x][y] == 1)return 0;
	int mark = 0;
	for(int i=y-1;i>=0;i--) {
		if(mp[x][i] == 1)
			mark++;
		else if(mp[x][i] == 2) {
			if(mark == 1) return 0;
			else mark++;
		}
	}
	mark = 0;
	for(int i=x-1;i>=0;i--) {
		if(mp[i][y] == 1)
			mark++;
		else if(mp[i][y] == 2) {
			if(mark == 1)return 0;
			else mark++;
		}
	}
	return 1;
}

void dfs(int x,int y,int cnt) {
	int tx = x/n;
	if(n == 1)tx = 0;
	int ty = y%m;
	ans = max(ans,cnt);
	if(tx >= n) return;
	if(tx == 0 && y >= n * m)return;
	if(cal(tx,ty)) {
		mp[tx][ty] = 2;
		dfs(x+1,y+1,cnt+1);
		mp[tx][ty] = 0;

		dfs(x+1,y+1,cnt);
	}
	else
		dfs(x+1,y+1,cnt);
}

int main() {
	while(scanf("%d %d %d",&n,&m,&q) == 3) {
		init();
		ans = 0;
		memset(tmp,0,sizeof(tmp));
		while(q--) {
			int x,y;
			scanf("%d %d",&x,&y);
			mp[x][y] = 1;
			tmp[x][y] = 1;
		}
		dfs(0,0,0);
		printf("%d\n",ans);
	}
	return 0;
}

HDU4499 Cannon DFS 回溯的应用,布布扣,bubuko.com

时间: 2024-08-04 18:17:32

HDU4499 Cannon DFS 回溯的应用的相关文章

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

CodeForces 550B Preparing Olympiad(DFS回溯)

[题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每个题目有相应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x,求选择方案数. [解题思路]: DFS+回溯. 先发一发比较拙的代码: #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int num[N],mum[N]; int n,m,q,t,l,r; int top,ans,

POJ2488-A Knight&#39;s Journey(DFS+回溯)

题目链接:http://poj.org/problem?id=2488 A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36695   Accepted: 12462 Description Background The knight is getting bored of seeing the same black and white squares again and again

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

poj1321——dfs回溯

POJ 1321  DFS回溯+递归枚举 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24813   Accepted: 12261 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行

hduoj2553——N皇后问题,dfs回溯

hduoj 2553  dfs,回溯 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10297    Accepted Submission(s): 4634 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的

HDU 1015 dfs回溯

题目真长.....看了好长时间才看懂.. 就是给你一个32位数字和一个最多15个字符的字符串,从字符串中选出5个字符,若满足题中给的那个式子,输出字典序最大的那5个字符,若不满足,输出no solution. 为了解决字典序问题,在输入字符串后,把字符串按从大到小排一下序,搜索一下若满足条件输出即可. 贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <

CodeForces 550B Preparing Olympiad(DFS回溯+暴力枚举)

[题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每一个题目有对应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x,求选择方案数. [解题思路]: DFS+回溯. 先发一发比較拙的代码: #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int num[N],mum[N]; int n,m,q,t,l,r; int top,ans

uva--10400+dfs+回溯

题意: 输入n个正整数和一个目标值,可以在这n个数中间填充+ - × /号进行运算,运算从左到右进行,不考虑运算符的优先性. 并且给定下面的规则: 1.填充符号时n个数的顺序不能改变. 2.填充除号的时候必须保证结果为整数. 3.每一步的结果必须在-32000-32000之间. 问是否可以求得目标值. 思路: 很显然可以用dfs+回溯来实现符号的填充,但是直接dfs是绝对会超时的(我就WA了一发);那么我们就要考虑剪枝了,这个题目可以利用状态来进行剪枝:我们记录下每一步得到的结果,如果回溯到这一