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++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

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下拉框实现搜索步骤一这