hdu4431 Mahjong 枚举搜索。。

2024-05-28 11:18
文章标签 搜索 枚举 hdu4431 mahjong

本文主要是介绍hdu4431 Mahjong 枚举搜索。。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

japanese麻将什么玩意。。都没有豪华七对。。。

没什么难的 就是枚举搜索了

分三种类型的胡牌

f1是七对 f2是十三幺 f3是普通的胡牌 就先找一对 再找三个三个的

就是一直超时。。在峰峰的指导下加了好多剪枝 注释都标出来了。。这样才过 而且好慢。。


#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;int cnt[40],res,ans[40];
map<string,int>mp;
void init()
{mp["1m"]=1; mp["1s"]=11; mp["1p"]=21;mp["2m"]=2; mp["2s"]=12; mp["2p"]=22;mp["3m"]=3; mp["3s"]=13; mp["3p"]=23;mp["4m"]=4; mp["4s"]=14; mp["4p"]=24;mp["5m"]=5; mp["5s"]=15; mp["5p"]=25;mp["6m"]=6; mp["6s"]=16; mp["6p"]=26;mp["7m"]=7; mp["7s"]=17; mp["7p"]=27;mp["8m"]=8; mp["8s"]=18; mp["8p"]=28;mp["9m"]=9; mp["9s"]=19; mp["9p"]=29;mp["1c"]=31;mp["2c"]=32; mp["3c"]=33;mp["4c"]=34;mp["5c"]=35; mp["6c"]=36;mp["7c"]=37;
}int f1()//7dui
{int a=0;for(int i=1;i<=38;i++){if(cnt[i]==2) a++;}return a==7;
}int f2()//13yao
{int i,j;for(i=0;i<30;i+=10){if(!cnt[i+1]||!cnt[i+9]) return 0;for(j=2;j<9;j++)if(cnt[i+j]) return 0;}for(i=31;i<=37;i++)if(!cnt[i]) return 0;return 1;
}int dfs()
{int i;if(res==0) return 1;for(i=1;i<30;i++){if(cnt[i]>=3){cnt[i]-=3;res-=3;if(dfs()){cnt[i]+=3;res+=3;return 1;}cnt[i]+=3;res+=3;}}for(i=1;i<30;i++){if(cnt[i]&&cnt[i+1]&&cnt[i+2]){cnt[i]--;cnt[i+1]--;cnt[i+2]--;res-=3;if(dfs()){cnt[i]++;cnt[i+1]++;cnt[i+2]++;res+=3;return 1;}cnt[i]++;cnt[i+1]++;cnt[i+2]++;res+=3;}}return 0;
}int f3()
{int i;for(i=1;i<38;i++)if(cnt[i]>=2){cnt[i]-=2;res=12;int ok=1;//这里再加一个剪枝 先找出连不成一句话的三个一样的for(int j=31;j<=37;j++){if(cnt[j]==3) res-=3;//减小dfselse if(cnt[j]) {ok=0;break;}}if(!ok) {cnt[i]+=2;continue;}if(dfs()){cnt[i]+=2;return 1;}cnt[i]+=2;}return 0;
}int main()
{int t,i,k;char s[5];init();scanf("%d",&t);while(t--){memset(cnt,0,sizeof cnt);for(i=0;i<13;i++){scanf("%s",s);cnt[mp[s]]++;}for(i=1,k=0;i<=37;i++){if(i%10==0||cnt[i]==4) continue;//如果这张牌已经有四个就不用加啦cnt[i]++;if(cnt[i]==4&&!cnt[i-1]&&!cnt[i+1]){cnt[i]--;//如果这张牌有四个 且相邻两个都没有 那一定不能胡continue;}if(f2()){ans[k++]=i;cnt[i]--;continue;}else if(cnt[i]==1&&!cnt[i-1]&&!cnt[i+1]){cnt[i]--;//判断为不是十三幺后continue;//如果这张牌只有一个 而且前后都没有 那一定不能胡}if(f1()||f3())ans[k++]=i;cnt[i]--;}if(k){// sort(ans.begin(),ans.end());//markprintf("%d",k);for(i=0;i<k;i++){if(ans[i]<10)printf(" %dm",ans[i]%10);else if(ans[i]<20)printf(" %ds",ans[i]%10);else if(ans[i]<30)printf(" %dp",ans[i]%10);else printf(" %dc",ans[i]%10);}putchar('\n');}else printf("Nooten\n");}return 0;
}




这篇关于hdu4431 Mahjong 枚举搜索。。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010415

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义