JohnAlex01 2015-04-27 11:43 采纳率: 0%
浏览 1845

采用深度优先搜索进行扑克牌的排序

 #include<iostream>
using namespace std;
int count=0; 
int book[5];
char card[5][2]={'2','C','A','D','A','C','J','C','J','H'};
char a[5][2];
void dfs(int step){
    if(step==5){
            count++;
            return ;
    }
    for(int i=0;i<5;i++){
        if(/*a[step][0]!=a[step-1][0]&&*/book[i]==0){//判断条件该牌未被标记且与上一张的牌号不相同,但我不知道应该如何写出这条判断语句,如果我将其注释掉,则输出120,是一个全排列。如果不注释,则输出为0.
            a[step][0]=card[i][0];
            book[i]=1;//将用过的牌标记
            dfs(step+1);
            book[i]=0;//取消标记
        }
    } 
    return ;
}
int main(){
    dfs(0);
    cout<<count<<endl;
    return 0;
}

图片说明
图片说明
我未按照题目要求,只是给出了特定的扑克牌进行算法可行性的验证,如第三组数据所示,该程序应输出48.
现在的问题是不知如何进行条件的判断。悉心向各位请教

  • 写回答

1条回答 默认 最新

  • l4kangaxx 2015-04-27 12:08
    关注

    你就全排列出所有的组合模式,另外添加一个函数 bool isDifferenSequence(char compsite[][]),每种组合放进去判断一下,不是很简单么。
    bool isDifferentSequence(char seq[][])
    {
    for(int i = 0;i<4;i++)
    {
    if (seq[i][0] == seq[i+1][0])
    return false;
    }
    return true;
    }

    另外你自己的代码,step明明是从0开始计数的,下标似乎有-1了吧?不会报错么?

    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题