程式描述:
一副紙牌有52張,4種花色,每種花色13張。我們能用乙個整數m就表示出所有的52種情況,規則是:
m / 13: =0: 紅心,=1: 方塊,=2: 梅花,=3: 黑桃
m % 13: =0:2,=1:3,=2:4 .... =8:10,=9:j,=10:q,=11: k,=12:a
比如:m = 15 就表示:方塊4 m=38表示:梅花a
我們希望用程式模擬1副撲克牌隨機抽取13張,發給某人的過程。
發牌後需要排序:規則是:先按花色,再按點數。花色的大小順序是:梅花、方塊、紅心、黑桃。點數的順序是:2、3、4、…. 10、j、q、k、a。
然後,挑選出最大的連續牌型。規則是:連續張數多的大。張數相等的則花色大的大(此時與點數無關)。
我們先分析下,上面的題目要求描述的很清楚了,我們要實現三個步驟:1,發牌(隨機)2,排序 3,輸出最大的連續牌型。
1,發牌
這個比較簡單,我直接貼下**:
1這裡我們用point陣列儲存點數,puke陣列的下標分別儲存花色和點數,值為1表示這張牌已經發了,x+3是花色的轉義字元。int m,k=0
,i,j,l,t,x,y;
2int puke[4][13]=;
3int w[4]=;
4char point[13]=;
5srand(time(null));
6while(k<13)7
15 puke[x][y]=1
;16 printf("
%c",x+3
);17
if(y==8)18
21 printf("
%c "
,point[y]);
22 k++;
23 }
2,排序
其實這個也好實現,因為我們儲存的發牌在puke陣列中,排序規則是先按花色,再按點數,這裡我們用笨方法,用四個for迴圈就可以實現,分別遍歷puke陣列。
示例**:
13,輸出最大的連續牌型for(j=0;j<13;j++)
210 printf("
%c "
,point[j]);11}
12}13for(j=0;j<13;j++)
1422 printf("
%c "
,point[j]);23}
24}25for(j=0;j<13;j++)
2634 printf("
%c "
,point[j]);35}
36}37for(j=0;j<13;j++)
3846 printf("
%c "
,point[j]);47}
48 }
示例**:
1count陣列的意思是各個花色牌連續最大數,index陣列儲存的是開始各個花色連續的開始點數,就是point陣列的下標。int count[4]=;
2int index[4]=;
3int temp=0;
4for(i=0;i<4;i++)514
else
1521 temp=0;22
}23}24
}25 count[i]++;26}
2728
int max=0; 29
if(count[3]>max)
3034
for(i=0;i<3;i++)
3541}42
43int a=index[temp]-max;
44for(i=0;i)
4551 printf("
%c "
,point[a]);
5253 a++;
54 }
實現效果:
全部程式**:
當然這只是實現的一種方法,可能園友有更好的實現方法,歡迎指點。。。
C演算法程式設計題(一)撲克牌發牌
上週寫 我的程式設計開始 c 這篇文章的時候,說過有時間的話會寫些演算法程式設計的題目,可能是這兩天週末過的太舒適了,忘記寫了。下班了,還沒回去,閒來無事就寫下吧。因為寫c 的程式設計題和其他語言實現功能不一樣,要動腦子,寫筆記,思考整個的流程。就比如實現字串擷取,c 直接乙個substring搞定...
洗牌 發牌演算法 打亂撲克牌順序
洗牌的演算法有很多,這裡主要介紹下幾種主要的演算法。方法一 每次找乙個隨機的位置,然後將這54個數放到找的位置中。步驟 1.用乙個整型陣列記錄各個位置是否已經放置了數,如果放置了則不為0,否則為0。所以在演算法開始的時候,初始化此陣列每個元素的值都為0.2.每次產生乙個0 53之間的數,看這個位置是...
撲克牌的隨機發牌程式
乙個撲克牌遊戲 準確的說就是 鬥地主 本來是打算取0 53的隨機數,取過的就做乙個標識,迴圈直至全部完。但是細想一下,效率實在是太低了,最後決定用亂序的方式,感覺還不錯。不知道還有沒有更好的辦法,請大家多多指教!using system using system.collections namesp...