【DFS】【DP】【DG特长生2017】T2益智游戏

题目大意

24点游戏。
给你n组数据,要你得出这四个数是否能完成24点。
需要注意的是可以使用括号且数字顺序可调换,运算过程中只能出现整数。
(然而原题面上没说数字顺序可调换…导致一堆人比赛时70分…)


原题:顺序可调换

由于顺序可以打乱,直接暴力dfs看看能不能合成24。

顺序不可调换

啊啊,挺头裂的。
悄悄跑去问TJH大爷这题怎写。

TJH:我不清楚对不对啊 就暴搜啊
我:这题气得我想用桶…
TJH:这?我用了个vector

好。vector,我不会。再见。

于是写了个DP。分区间处理结果…再合并。然后一个区间可能有多种结果…又再枚举出来、运算。
然后,就五重了…
整挺烦的。


代码

原题:顺序可调换
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int flag,b[11],a[11],t;
void dfs(int now, int z){
    
    
	if(now == 4){
    
    
		if(z == 24) flag = 1;
		return;
	} 
	for(int i = 1; i <= 4; ++i)
		if(b[i] == 0){
    
    
			b[i] = 1;
			dfs(now+1, z+a[i]);  //加减乘除
			dfs(now+1, z-a[i]);
			dfs(now+1, z*a[i]);
			if(a[i] != 0) if(z % a[i] == 0) dfs(now+1, z/a[i]); //除法特别判断
			b[i] = 0;
		}
}
void work(){
    
    
	scanf("%d%d%d%d",&a[1], &a[2], &a[3], &a[4]);
	memset(b, 0, sizeof(b));
	flag = 0;
	for(int i = 1; i <= 4; ++i){
    
      //枚举第一个数
		b[i] = 1;
		dfs(1, a[i]);  //正或负
		dfs(1, -a[i]);
		if(flag == 1) break;
		b[i] = 0;
	} 
	if(flag == 1) printf("1\n");
	else printf("0\n");
}
int main(){
    
    
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	scanf("%d", &t);  //多组数据
	while(t--) work();
	fclose(stdin);
	fclose(stdout);
} 
顺序不可调换

(注释都不想打了…艹

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int flag, s[10][10][10000], a[10], l[10][10], t;
void work(){
    
    
	scanf("%d%d%d%d", &a[1], &a[2], &a[3], &a[4]);
	memset(s, 0, sizeof(s));
	memset(l, 0, sizeof(l));
	l[1][1] = 1; l[2][2] = 1; l[3][3] = 1; l[4][4] = 1;
	s[1][1][1] = a[1];
	s[2][2][1] = a[2];
	s[3][3][1] = a[3];
	s[4][4][1] = a[4];
	for(int len = 2; len <= 4; ++len)  // 长度 
		for(int q = 1; q <= 5-len; ++q) // 起始
			for(int d = q; d < q+len-1; ++d){
    
     //断点:从q到d,从d+1到q+len-1
				for(int jg1 = 1; jg1 <= l[q][d]; ++jg1) //前个区间的可能的结果
					for(int jg2 = 1; jg2 <= l[d+1][q+len-1]; ++jg2){
    
     //后个区间的可能的结果
						s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] + s[d+1][q+len-1][jg2];
						s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] - s[d+1][q+len-1][jg2];
						s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] * s[d+1][q+len-1][jg2];
						if(s[d+1][q+len-1][jg2] != 0) 
						if(s[q][d][jg1] % s[d+1][q+len-1][jg2] == 0)
							s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] / s[d+1][q+len-1][jg2];
					}
			}
	for(int i = 1; i <= l[1][4]; ++i)
		if(s[1][4][i] == 24) {
    
    
			printf("1\n");
			return;
		}
	printf("0\n");
}
int main(){
    
    
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	scanf("%d", &t);
	while(t--) work();
	fclose(stdin);
	fclose(stdout);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/115415190