NOIP201507斗地主(C++)

#include<cstdio>
#include<cstring>
using namespace std;
#define N 30
int n,T,ans,a[N],c[N];
int query(){
memset(c,0,sizeof c);
for(int i=0;i<=14;i++) c[a[i]]++;
int tot=0;
while(c[4]&&c[2]>1) c[4]--,c[2]-=2,tot++;
while(c[4]&&c[1]>1) c[4]--,c[1]-=2,tot++;
while(c[4]&&c[2]) c[4]--,c[2]--,tot++;
while(c[3]&&c[2]) c[3]--,c[2]--,tot++;
while(c[3]&&c[1]) c[3]--,c[1]--,tot++;
return tot+c[1]+c[2]+c[3]+c[4];
}
void dfs(int now){
if(now>=ans) return ;
int tmp=query();
if(now+tmp<ans) ans=now+tmp;
for(int i=3;i<=14;i++){
int j=i;
for(;a[j]>=3;j++);
if(j-i>=2){
for(int t=i+1;t<=j-1;t++){
for(int k=i;k<=t;k++) a[k]-=3;
dfs(now+1);
for(int k=i;k<=t;k++) a[k]+=3;
}
}
}
for(int i=3;i<=14;i++){
int j=i;
for(;a[j]>=2;j++);
if(j-i>=3){
for(int t=i+2;t<=j-1;t++){
for(int k=i;k<=t;k++) a[k]-=2;
dfs(now+1);
for(int k=i;k<=t;k++) a[k]+=2;
}
}
}
for(int i=3;i<=14;i++){
int j=i;
for(;a[j]>=1;j++);
if(j-i>=5){
for(int t=i+4;t<=j-1;t++){
for(int k=i;k<=t;k++) a[k]-=1;
dfs(now+1);
for(int k=i;k<=t;k++) a[k]+=1;
}
}
}
}
int main(){
scanf("%d%d",&T,&n);
while(T--){
memset(a,0,sizeof a);ans=1e9;
for(int i=1,x,y;i<=n;i++){
scanf("%d%d",&x,&y);
if(x==1) x=14;
a[x]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}

时间: 2024-11-05 18:59:27

NOIP201507斗地主(C++)的相关文章

斗地主 (NOIP2015 Day1 T3)

斗地主 思路 :读入时注意将A作为第14张牌,因为它可以连在K后, 总体思路为 先出炸弹和四带二 再出三带一 再把对牌和单牌出完 记录并更新Answer,后枚举顺子,并继续向下搜索. 注意:弄明白题意,题目描述不太清楚....另外,我觉的牌的花色只是能用来区分大小王.另外在整顺子之前也可以用贪心来搞其他类似四带二,三带一等的牌 #include <iostream> #include <cstdio> #include <cstring> using namespace

结对项目之小游戏编程(斗地主)

一.题目简介    本次的项目是编写一个斗地主的小游戏,实现语言:java:主要完成了GUI设计.计时线程.算法.本次项目的主要目的是对算法的学习.算法分析在心得里面. 技术难点:1.图片的移动    2.计时线程的设定   3.对牌的分割,必须考虑到优先拆分方案,将权值低的拆分方案舍去. 4.在删除的时候遇到问题了,删除不了. 二.结对分工及过程 本次结对项目的成员有两个,张国伟:负责对GUI界面的设计,完成功能:洗牌功能,发牌功能,打牌功能的图片的位移处理,基本打牌的桌面等等. 我主要负责对

Libgdx: android单机斗地主支持局域网wifi联网的网络模块核心代码

这个作品是我最近写的,结合我的毕业设计的通信模块和之前的单机版斗地主.我已经上架到豌豆荚了,贴了点广告,看看能不能赚点茶钱.可是一点也不乐观.因此我想分享给大家源码.只要不用于商业. 下面先贴网络模块的核心代码,第一次写这种逻辑用的udp, 经验不够,没有写的那么好看. 这里是我上架的apk,大家下载来试试也无妨: 地址 http://www.wandoujia.com/apps/com.hj.joker package com.hj.net; import java.io.ByteArrayI

Android斗地主棋牌游戏牌桌实现源码下载

本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下:为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity    package com.bison;            import android.app.Activity;      import android.content.pm.ActivityInfo;      import android.os.Bundle;      import android.view.Wind

洛谷 P2668 斗地主

P2668 斗地主 统计单牌和对牌的数量 然后 凑顺子,能凑就凑 还有四带balabala和三带balabala 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,t,s[15],ans,a,b; 4 5 inline void read(int &now) 6 { 7 char ch=getchar(); now=0; 8 while(ch>'9'||ch<'0') ch=getchar(); 9 while

洛谷—— P2668 斗地主

https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响.每一局游戏中,一副手牌由n张牌组成.游戏者每次可以根据规定的

自己写的一部分斗地主的程序,没有去写界面,临时是用黑框来显示的

这几天比較空,所以想写一点东西. 斗地主的程序一直以来都想写,但感觉规则推断比較复杂,一直没有较多的时间来写. 这次主要是把跟牌和牌型的推断写出来了.写了一个比較弱智的AI,属于有牌就出的那种.对于AI算法,临时没有什么好的想法,所以打算临时放一放. 后期补上界面之后再进行优化. 在这就把基本的函数和算法列出来吧. 首先是主程序,主要控制显示和游戏的流程. #include <iostream> #include "PokerDesk.h" using namespace

妞一个斗地主发牌程序!!!

学习java三个星期,利用所学的知识做了一个三人斗地主发牌程序,闲话少叙,上代码 1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.List; 4 5 /** 6 * 三人斗地主程序 功能:将一副牌随机分发给地主(20张牌),农民A(17张牌),农民B (17张牌) 7 * 步骤:1.洗牌阶段:将54张牌储存到ArraryList 容器中(批量储存,for循环) 8 * 2.发牌阶段:

P2668 斗地主

P2668 斗地主 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响.每一局游戏中,一副手牌由n张牌组成.游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利. 现在,牛牛只想