【題意】按照鬥地主出牌規則,給定手牌求出完的最少步數。
【演算法】模擬+搜尋
【題解】
可以發現除了順子,其它的出牌規則都和點數無關,只與同點數的牌數有關。
所以可以先暴力列舉要出哪些順子,然後每乙個出完順子後手牌的情況處理成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#includeview code#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!
NOIP2015提高組 鬥地主
noip2015 提高組 day1 t3 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃 紅心 梅花 方片的a到k加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關係根據牌的數碼表示如下 3 4 5 6 7 8 9 10第一行包含用空格隔開的 2 個正整數 t n 表示手牌...
NOIP2015提高組Day1鬥地主
仔細看,這道題著實想不到什麼優美的演算法,那麼基本確定方向 dfs。先分析,這題的花色是沒用的 我們再分析,會發現這題的出牌順序是不影響答案的 那麼我們便可以先出牌多的 因為這樣答案便會先便小,那麼便可以方便後面的剪枝 也就是我們先打順子再打帶牌!順子是沒有什麼技巧的,便直接暴搜 當然也是先暴搜長度...
NOIP2015提高組Day1 鬥地主
這道題做的時候讓我幾近崩潰,因為如果要打暴力的話太煩了不想打 但是我們發現 這樣只要判斷前六種方法就行了,打幾個判斷,30 首先,做一下基本處理 簡化題目 因為一般的鬥地主除了大王小王,沒有花色的大小區別,但這裡也不是讓你贏,只是自己乙個人快速打光牌。我們發現花色並沒有什麼用,可以免去。所以我們我們...