NOIP 提高組2015 鬥地主

2022-04-30 03:21:08 字數 1194 閱讀 5793

【題意】按照鬥地主出牌規則,給定手牌求出完的最少步數。

【演算法】模擬+搜尋

【題解】

可以發現除了順子,其它的出牌規則都和點數無關,只與同點數的牌數有關。

所以可以先暴力列舉要出哪些順子,然後每乙個出完順子後手牌的情況處理成b[4]表示牌數為1~4的點數有多少個,然後進行dfs。(為了方便,將a接在14,然後注意2不能順)

dfs(s,t,j,z)表示有s組牌數為1,有t組牌數為2,有j組牌數為3,有z組牌數為4的情況出完手牌的最少步數。(可以記憶化)

然後在dfs討論一下【單打】【拆牌】【帶牌】三種情況,對應轉移就可以了。(資料小,寫多暴力都沒關係)

雙王在進入dfs前特殊處理:有雙王就考慮多一種當炸彈打的情況,然後就直接將王當作單排進入dfs。

**已通過各大oj增強版(>w

#include#include

#include

using

namespace

std;

const

int maxn=30,inf=0x3f3f3f3f

;const

int limit[5]=;

intf[maxn][maxn][maxn][maxn],a[maxn],b[maxn];

int min(int a,int b)

int dfs(int s,int t,int j,int

z)int calc(int

step)}}

b[1]=b[2]=b[3]=b[4]=0

;

for(int i=2;i<=14;i++)b[a[i]]++;

if(a[0]==2)ans=min(ans,step+1+dfs(b[1],b[2],b[3],b[4

]));

b[1]+=a[0

]; ans=min(ans,step+dfs(b[1],b[2],b[3],b[4

]));

return

ans;

}

intmain()

a[14]=a[1

]; printf(

"%d\n

",calc(0

)); }

return0;

}//thanks for lucius's code!

view code

NOIP2015提高組 鬥地主

noip2015 提高組 day1 t3 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃 紅心 梅花 方片的a到k加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關係根據牌的數碼表示如下 3 4 5 6 7 8 9 10第一行包含用空格隔開的 2 個正整數 t n 表示手牌...

NOIP2015提高組Day1鬥地主

仔細看,這道題著實想不到什麼優美的演算法,那麼基本確定方向 dfs。先分析,這題的花色是沒用的 我們再分析,會發現這題的出牌順序是不影響答案的 那麼我們便可以先出牌多的 因為這樣答案便會先便小,那麼便可以方便後面的剪枝 也就是我們先打順子再打帶牌!順子是沒有什麼技巧的,便直接暴搜 當然也是先暴搜長度...

NOIP2015提高組Day1 鬥地主

這道題做的時候讓我幾近崩潰,因為如果要打暴力的話太煩了不想打 但是我們發現 這樣只要判斷前六種方法就行了,打幾個判斷,30 首先,做一下基本處理 簡化題目 因為一般的鬥地主除了大王小王,沒有花色的大小區別,但這裡也不是讓你贏,只是自己乙個人快速打光牌。我們發現花色並沒有什麼用,可以免去。所以我們我們...