1. 程式人生 > >每天一道演算法題(22)——撲克牌的順子

每天一道演算法題(22)——撲克牌的順子

題目:

         從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2-10為數字本身,A為1,J為11,Q為12,K為13,而大小王可以看成任意數字。

思路:

      設定王為0。統計非王的牌之間的空格數,若小於王的總數(對應填補),則為順子。有任意一張牌大於2,為非順子。

程式碼:

bool process(const char* str=NULL){
	 if(!str||strlen(str)<5)
		 return false;

	 int* data=new int[14];
	 memset(data,0,14*sizeof(int));//使用之前一定初始化
	 while(*str!='\0')
            data[*str++ - '0']++;//統計牌數

	 int counter=0;//非王的牌的總數
	 int blank=0;//牌之間的空格數
	 bool flag=false;
	 for(int i=1;i<14&&(counter<=5-data[0]);i++){
		 if(data[i]==1){//出現一張
			 counter++;
			 flag=true;
		 }
		 else if(data[i]>1){//對子以及以上
			 delete []data;
			 return false;
		 }
		 else if(flag)//牌之間空格數
			 blank++;
          }

         int king=data[0];
         delete []data;

         if(blank<=king)//比較空格和king的張數
	    return true;
         else
            return false;
}