第七天 dfs剪枝&优化

第七天 dfs剪枝&优化

1可行性剪枝

2最优性剪枝

3重复性剪枝

1

输入

5 5 6

...S.

XX.X.

...X...

...D.X

...X...

输出

YES


题解

cpp 复制代码
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 10;
int n,m,T;
char mat[N][N];
bool vis[N][N];
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
bool ok;
void dfs(int x,int y,int t){
	if(ok){
		return;
	}
	if(t == T){
		if(mat[x][y] == 'D'){
			ok = true;
		}
		return;
	}
	vis[x][y] = true;
	for(int i = 0;i<4;i++){
		int tx = x + dx[i];
		int ty = y + dy[i];
		if(tx<0 || tx >=n || ty<0 || ty>=m || mat[tx][ty] == 'X'|| vis[tx][ty]){
			continue;
		}
		dfs(tx,ty,t+1);
	}
	vis[x][y] = false;
}
int main(){
	cin >>n>>m>>T;
	for(int i = 0;i<n;i++){
		cin >>mat[i];
	}
	int sx,sy,ex,ey;
	for(int i = 0;i<n;i++){
		for(int j = 0;j<m;j++){
			if(mat[i][j] == 'S'){
				sx = i;
				sy = j;
			}
			if(mat[i][j] == 'D'){
				ex = i;
				ey = j;
			}
		}
	}
	if((sx+sy+ex+ey+T) % 2 != 0){
		cout <<"NO"<<endl;
	}else{
		ok = false;
		dfs(sx,sy,0);
		if(ok){
			cout <<"YES"<<endl;
		}else{
			cout <<"NO"<<endl;
		}
	}
	return 0;
} 

2

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为N*pi的M层生日蛋糕,每层都是一个圆柱体。

设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。

由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。

令Q = S*pi

请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。

(除Q外,以上所有数据皆为正整数)

Input:

有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。

Output:

仅一行,是一个正整数S(若无解则S = 0)。

Time Limit:1000MS Memory Limit: 10000K

Sample Input

100

2

样例输出

68


题解

cpp 复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int n,m;
int ans;
int vs[20];
void dfs(int u,int v,int s,int r0,int h0){  //当前层数 当前体积 当前表面积 半径上界 高上界 
	if(u == m){
		if(v == n){
			ans = min(ans,s);
		}
		return;
	}
	if(va[m-u]+v>n){
		return;
	}
	if(2.0*(n-v)/r0 +s >ans){
		return;
	}
	for(int r = r0;r>=m-u;r--){
		for(int h = h0;h>=m-u;h--){
			int tv = v+r*r*h;
			if(tv > n)
				continue;
			int ts = s+2*r*h;
			if(u == 0){
				ts += r*r;
			}
			dfs(u+1,tv,ts,r-1,h-1);
		}
	}
	 
}
int main(){
	cin >>n>>m;
	for(int i = 1;i<=m;i++){
		va[i] = va[i-1]+i*i*i;
	}
	int r0 = sqrt(n) + 0.5;
	ans = INF;
	dfs(0,0,0,r0,n);
	if(ans == INF){
		ans = 0;
	}
	cout <<ans<<endl;
	return 0;
}

3

全排列

题解

cpp 复制代码
#include<iostream>
#include<cstdio>
using namespace std;
int ans,n;
bool vis[50];
void dfs(int cnt,int num){ //列举的第几个数字 输出的数 
	if(cnt == n){
		cout <<num<<endl;
		return;
	}
	for(int i = 1;i<=n;i++){
		if(!vis[i]){
			vis[i] = true;
			dfs(cnt+1,num*10+i);
			vis[i] = false;
		}
	}
}
int main(){
	cin >>n;
	ans = 1;
	for(int i = 1;i<=n;i++){
		ans *= i;
	}
	cout <<ans<<endl;
	dfs(0,0);
	return 0;
}
相关推荐
晴空闲雲23 分钟前
数据结构与算法-树和二叉树-二叉树的存储结构(Binary Tree)
数据结构·算法
索迪迈科技2 小时前
Flink Task线程处理模型:Mailbox
java·大数据·开发语言·数据结构·算法·flink
元亓亓亓3 小时前
LeetCode热题100--230. 二叉搜索树中第 K 小的元素--中等
算法·leetcode·职场和发展
草莓熊Lotso3 小时前
《算法闯关指南:优选算法-双指针》--01移动零,02复写零
c语言·c++·经验分享·算法·leetcode
焜昱错眩..4 小时前
代码随想录算法训练营第三十九天|62.不同路径 63.不同路径ll
算法
焦耳加热7 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn7 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6068 小时前
常用排序算法核心知识点梳理
算法·排序
蒋星熠10 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油11 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展