UOJ147 搜索 解题报告
2017-08-10 15:14
337 查看
题目描述
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4<5<6<7<8<9<10 < J < Q < K < A<2<小王<大王而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由 nn 张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。
现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。
需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:
牌型 牌型说明 牌型举例
火箭 即双王(双鬼牌) ♂ ♀
炸弹 四张同点牌。 ♠A ♥A ♣A ♦A
单张牌 单张牌 ♠3
对子牌 两张码数相同的牌 ♠2 ♥2
三张牌 三张码数相同的牌 ♠3 ♥3 ♣3
三带一 三张码数相同的牌 + 一张单牌 ♠3 ♥3 ♣3 ♠4
三带二 三张码数相同的牌 + 一对牌 ♠3 ♥3 ♣3 ♠4 ♥4
单顺子 五张或更多码数连续的单牌(不包括 2 点和双王) ♠7 ♣8 ♠9 ♣10 ♣J
双顺子 三对或更多码数连续的对牌(不包括 2 点和双王) ♣3 ♥3 ♠4 ♥4 ♠5 ♥5
三顺子 二个或更多码数连续的三张牌(不能包括 2 点和双王) ♠3 ♥3 ♣3 ♠4 ♥4 ♣4 ♠5 ♦5 ♥5
四带二 四张码数相同的牌+任意两张单牌(或任意两对牌) ♠5 ♥5 ♣5 ♦5 ♣3 ♣8
输入格式
第一行包含用空格隔开的2个正整数 T,nT,n ,表示手牌的组数以及每组手牌的张数。
接下来 TT 组数据,每组数据 nn 行,每行一个非负整数对 ai,biai,bi ,表示一张牌,其中 aiai 表示牌的数码, bibi 表示牌的花色,中间用空格隔开。特别的,我们用 11 来表示数码 A, 1111 表示数码 J, 1212 表示数码 Q, 1313 表示数码 K;黑桃、红心、梅花、方片分别用 1-4 来表示;小王的表示方法为 0 1 ,大王的表示方法为 0 2 。
输出格式
共 TT 行,每行一个整数,表示打光第 ii 组手牌的最少次数。
【解题报告】
爆搜。
代码如下:
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4<5<6<7<8<9<10 < J < Q < K < A<2<小王<大王而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由 nn 张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。
现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。
需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:
牌型 牌型说明 牌型举例
火箭 即双王(双鬼牌) ♂ ♀
炸弹 四张同点牌。 ♠A ♥A ♣A ♦A
单张牌 单张牌 ♠3
对子牌 两张码数相同的牌 ♠2 ♥2
三张牌 三张码数相同的牌 ♠3 ♥3 ♣3
三带一 三张码数相同的牌 + 一张单牌 ♠3 ♥3 ♣3 ♠4
三带二 三张码数相同的牌 + 一对牌 ♠3 ♥3 ♣3 ♠4 ♥4
单顺子 五张或更多码数连续的单牌(不包括 2 点和双王) ♠7 ♣8 ♠9 ♣10 ♣J
双顺子 三对或更多码数连续的对牌(不包括 2 点和双王) ♣3 ♥3 ♠4 ♥4 ♠5 ♥5
三顺子 二个或更多码数连续的三张牌(不能包括 2 点和双王) ♠3 ♥3 ♣3 ♠4 ♥4 ♣4 ♠5 ♦5 ♥5
四带二 四张码数相同的牌+任意两张单牌(或任意两对牌) ♠5 ♥5 ♣5 ♦5 ♣3 ♣8
输入格式
第一行包含用空格隔开的2个正整数 T,nT,n ,表示手牌的组数以及每组手牌的张数。
接下来 TT 组数据,每组数据 nn 行,每行一个非负整数对 ai,biai,bi ,表示一张牌,其中 aiai 表示牌的数码, bibi 表示牌的花色,中间用空格隔开。特别的,我们用 11 来表示数码 A, 1111 表示数码 J, 1212 表示数码 Q, 1313 表示数码 K;黑桃、红心、梅花、方片分别用 1-4 来表示;小王的表示方法为 0 1 ,大王的表示方法为 0 2 。
输出格式
共 TT 行,每行一个整数,表示打光第 ii 组手牌的最少次数。
【解题报告】
爆搜。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 16 int n,a ,ans,cnt[5]; int calc() { int ret=0,temp; memset(cnt,0,sizeof(cnt)); for(int i=0;i<=14;i++) cnt[a[i]]++; if(cnt[4]) { temp=min(cnt[4],cnt[2]/2); ret+=temp; cnt[4]-=temp; cnt[2]-=2*temp; temp=min(cnt[4],cnt[1]/2); ret+=temp; cnt[4]-=temp; cnt[1]-=2*temp; } if(cnt[3]) { temp=min(cnt[3],cnt[2]); ret+=temp; cnt[3]-=temp; cnt[2]-=temp; temp=min(cnt[3],cnt[1]); ret+=temp; cnt[3]-=temp; cnt[1]-=temp; } for(int i=1;i<=4;i++) ret+=cnt[i]; if(cnt[1]>=2&&a[0]&&a[1]) ret--; return ret; } void dfs(int step) { if(step>=ans) return; ans=min(ans,step+calc()); for(int i=3;i<=14;i++) if(a[i]>=3) for(int j=i+1;j<=14;j++) { if(a[j]<3) break; for(int k=i;k<=j;k++) a[k]-=3; dfs(step+1); for(int k=i;k<=j;k++) a[k]+=3; } for(int i=3;i<=14;i++) if(a[i]>=2) for(int j=i+1;j<=14;j++) { if(a[j]<2) break; if(j-i<2) continue; for(int k=i;k<=j;k++) a[k]-=2; dfs(step+1); for(int k=i;k<=j;k++) a[k]+=2; } for(int i=3;i<=14;i++) if(a[i]>=1) for(int j=i+1;j<=14;j++) { if(a[j]<1) break; if(j-i<4) continue; for(int k=i;k<=j;k++) a[k]--; dfs(step+1); for(int k=i;k<=j;k++) a[k]++; } for(int i=2;i<=14;i++) { if(a[i]==4) { for(int j=2;j<=14;j++) { if(j==i) continue; if(a[j]==4) { a[i]=a[j]=0; dfs(step+1); a[i]=a[j]=4; } if(a[j]>=3) for(int k=2;k<=14;k++) { if(k==i||k==j) continue; if(a[k]>=2) { a[i]-=4;a[j]-=2;a[k]-=2; dfs(step+1); a[i]+=4;a[j]+=2;a[k]+=2; } } if(a[j]>=2) { for(int k=2;k<=14;k++) { if(k==i||k==j) continue; if(a[k]>=1) { a[i]-=4;a[j]-=1;a[k]-=1; dfs(step+1); a[i]+=4;a[j]+=1;a[k]+=1; } } a[i]-=4;a[j]-=2; dfs(step+1); a[i]+=4;a[j]+=2; } } } if(a[i]==3) { for(int j=2;j<=14;j++) { if(j==i)continue; if(a[j]>=2) { a[i]-=3;a[j]-=1; dfs(step+1); a[i]+=3;a[j]+=1; } if(a[j]>=3) { a[i]-=3;a[j]-=2; dfs(step+1); a[i]+=3;a[j]+=2; } } } } } int main() { int T; scanf("%d%d",&T,&n); while(T--) { memset(a,0,sizeof(a)); for(int i=1,x,y;i<=n;i++) { scanf("%d%d",&x,&y); if(x==1) x=14; else if(x==0&&a[0]) x=1; a[x]++; } ans=calc(); dfs(0); printf("%d\n",ans); } }
相关文章推荐
- UOJ147 [NOIP2015]斗地主 解题报告【搜索】【贪心】
- 【原】 POJ 1426 Find The Multiple BFS搜索 解题报告
- POJ1011 Sticks解题报告(经典搜索)
- NOIP2015 斗地主 解题报告(搜索)
- FOJ--1046--Tempter of the Bone--解题报告(典型的迷宫搜索)
- USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
- POJ 3131 双向搜索 解题报告
- Leetcode 79 单词搜索 解题报告
- POJ-1321 棋盘问题 解题报告(搜索) 棋盘问题
- 解题报告 noi 2005 智慧珠游戏(BT 搜索)
- POJ-3009 Curling 2.0 解题报告(搜索) 冰壶游戏
- 解题报告:HDU_1813 Escape from Tetris 综合搜索IDA*
- 【test】2015.7.28搜索解题报告(一)
- 一中OJ #1194 数独 | 回溯 + 搜索 | 解题报告
- pku 1970 搜索 The Game 解题报告
- poj 1010 STAMPS 解题报告 -- 搜索 遍历 剪枝
- UOJ 147|NOIP 2015|斗地主|搜索|贪心
- 【test】2015.7.28搜索解题报告(二)
- 解题报告:HDU 4090 GemAnd Prince 搜索
- Can you solve this equation? (二分搜索)解题报告