当前位置: 代码迷 >> C语言 >> 想问个问题
  详细解决方案

想问个问题

热度:185   发布时间:2008-02-26 18:33:30.0
想问个问题
是这样的:
有一个数组,里面放着四种模式的数字的组合(可以是其它的数字,但必须是那四种组合),
例如:2,2    3,3,3    1,2,3,    4,4,4,4
其中每个数字最多不能超过4个,只能有一对组合是相同的(如2,2)

问题:如何判断这个数组中有 两个相同的数字 的组合?(如:5,5)

程序框架可是下面这样:
#include <iostream>
using namespace std;

bool IsDing(int Pai[], int n)
{
    ...
}

int main()
{
    //例如这里要判断9,9这个组合是否存在
    int cpg[] = {1,2,3, 3,3,3, 9,9} //不仅仅是这些,还可以任意组合
    if (IsDing(cpg, sizeof(cpg)/sizeof(int))
        cout << "有" << endl;
    else
        cout << "没有" << endl;
    return 0;
}

谁来给指点下,我写了好几个,都不行,郁闷了好几天了。给个思路也可以。
搜索更多相关的解决方案: int  数字  cpg  bool  std  

----------------解决方案--------------------------------------------------------
普通的搜索查找

如果要效率且要找的数据比较多,可以考虑先nlogn排一下序

(我忙碌中偶尔查资料上线看一下,有其它问题请请教其他高手)
----------------解决方案--------------------------------------------------------
楼主说的不清楚
----------------解决方案--------------------------------------------------------
排序我也想过,但那样会破坏原来的组合。比如:7,8,9    9,9 排序后就成了9,9,9 了
还有就是不可以用二维数组来做,这个本来是项目里的问题,用二维数组会破坏整体结构。
----------------解决方案--------------------------------------------------------
这个问题是我从项目里抽象出来的,描述的可能不是很标准,有不明白的可以说一下。谢谢了。
----------------解决方案--------------------------------------------------------
你只有一个组合啊,

即数组 cpg
----------------解决方案--------------------------------------------------------
#include <iostream>
using namespace std;

bool IsDing(int *Pai, int n)
{
    int Judge[2][1000]={{-1},{1}};
    int *p1,*p2;
    int i=0;
    p1=p2=Pai;
    do
    {
        if(*p1==*(p2+1))
        {

              Judge[1][i]++;
              p2=p2+1;
        }
        else
        {
            Judge[0][i]=*p1;
            p1=p2+1;
            i++;
        }
    }while(p1!=Pai+n);
    for(int j=0;j<i;j++)
    printf("Judge[0][%d]=%d,Judge[1][%d]=%d\n,",j,Judge[0][j],j,Judge[1][j]);
    return 0;
}

int main(void)
{
    //例如这里要判断9,9这个组合是否存在
    int cpg[] = {1,2,3,3,3,3,9,9}; //不仅仅是这些,还可以任意组合
    if (IsDing(cpg, sizeof(cpg)/sizeof(int)))
  //      cout << "有" << endl;
//   else
   //     cout << "没有" << endl;
    return 1;
}
我这个可以提取相临字符的个数.我没按照你的要求,你可以改一下...
----------------解决方案--------------------------------------------------------
/*估计这个应是对的 */
#include "stdio.h"
#include<conio.h>
main()
{
    int a[] = {1,2,3,3,9,9,3,3};
    int b[30];
    int i,j,k=0,num=0,test=0;
    for(i=0;i<7;i++)
    {   for(j=1;j<8;j++)
            if(a[i]==a[j])
            {
                k++;
            }
           num++;
           b[num]=k;
           k=0;
           if(b[num]==2)
           {
               test=a[i];
               break;
           }
     }
     printf("num=%d test=%d",b[num]-1,test);
     getchar();
}
----------------解决方案--------------------------------------------------------
/*
    如果数组中有2个连续的数字相同,并且下一个数字不同,则返回1,否则返回0。
    函数接受2个参数,第一个是数组的首地址,第二个是数组的大小
*/

int is_double(int * ar, int n)
{
    int i, temp, k;

    if(n < 2)
        return 0;
        
    temp = ar[0];
    i = k = 1;
    while(i < n)
    {
        if(temp == ar[i])
            k++;
        else if(k == 2)
            break;
            
        if(k > 2)
            k = 0;
            
        temp = ar[i];
        i++;
    }
   
    return ((k == 2) ? 1 : 0);
}
----------------解决方案--------------------------------------------------------
我的已经把所有相临的字符的个数都统计下来了.这样比较直接
----------------解决方案--------------------------------------------------------