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

相关文章

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——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;