游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2710|回复: 3

算法,让人很受挫折。。

[复制链接]

30

主题

89

帖子

91

积分

注册会员

Rank: 2

积分
91
发表于 2010-6-10 11:06:00 | 显示全部楼层 |阅读模式
//http://yzfy.org/dis/listpost.php?tid=980&extra=page%3D1
//算法题,实在是畏惧了。。我哪错了。


//==============================================================





//程序的写法是,每个功能块之间有个空行.
//功能块的说明注释在它的头上.

#define  array_num  4
#include <iostream>

using namespace std;
void rolling3(char*,char*,char*);
void rolling1(char*,char*);
void rolling2(char*,char*);
void rolling(char*,char*,char*);
void copy_string(char*);
void cmpstring(char (*pstr)[200001]);
char str[100001];   //it' a temp;
char str1[200001];
char str2[100001];
char total_cmp_str3[5][200001];
int s1=0;         
int s2=0;
int i=0;
int main()
{       
        char *Pstr=str,*Pstr1=str1,*Pstr2=str2;
        char *temp=str;
        int local_s1,local_s2;
        while(cin>>str1>>str2)
        {
                int flag=0;
                s1=strlen(str1);
                s2=strlen(str2);
                local_s1 =s1;
                local_s2 =s2;

                //两个字符串所有字符.进行分别比较.  
                //当遇到11 111;77 778899;
                //功能块可以处理.即:当11 111时将处理.即flag=6;flag==2*3;
                //77 778899.即flag=2;flag!=2*6;不满足条件.
                for(int b=0;b<local_s1;b++)
                {
                        for(int a=0;a<local_s2;a++)
                        {
                                if(str1==str2[a]){
                                        flag++;
                                }
                        }
                }
                if(flag==local_s1*local_s2){
                        strcat(str1,str2);
                        cout<<str1<<endl;
                        continue;
                }

                if(s1==1||s2==1){    //两个字符串有一个长度为1时。
                        strcat(str1,str2);
                        cout<<str1<<endl;
                        continue;
                }

                //以下解决的思想,保持str1,str2的数值。
                //要进行4次处理,处理后的字符串,保存在str1中。
                //每处理一次,就把str1中的数值放到total_cmp_str3中。
                //处理完成后,调用cmpstring函数.
                strcpy(total_cmp_str3[3],str1);
                strcpy(total_cmp_str3[4],str2);
                rolling2(str1,str2);         
                cout<<"strcpy(str2,str1)\t\t"<<total_cmp_str3[0]<<endl;

                strcpy(str1,total_cmp_str3[3]);
                strcpy(str2,total_cmp_str3[4]);
                rolling1(str1,str2);
                cout<<"stcpy(str1,str2)\t\t"<<total_cmp_str3[1]<<endl;

                strcpy(str1,total_cmp_str3[3]);
                strcpy(str2,total_cmp_str3[4]);
                rolling(str1,str2,str);
                cout<<"rolling>> \t\t"<<total_cmp_str3[2]<<endl;

                strcpy(str1,total_cmp_str3[3]);
                strcpy(str2,total_cmp_str3[4]);
                rolling3(str2,str1,str);
                cout<<"rolling3>>\t\t"<<total_cmp_str3[3]<<endl;
               
                cmpstring(total_cmp_str3);
                i=0;   // total_cmp_str3从0行,重新开始。
        }
       
       
        return 0;       
}
void cmpstring(char (*pstr)[200001])
{
/*        这个注释内容无用.
        //        char* pstr[]=total_cmp_str3;    //if(a<b&&a<c) {cout<<a;}
        //        int state=1;            //if(a>b&&b>c) {cout<<c;} //这也太复杂了,要用到第三个存储空间.
        //        int size=strlen(total_cmp_str3[0]);
        //  char total_cmp_str3[5][200001];
*/
        //解决思想是用指针数组存储total_cmp_str3各行指针。
        //用库函数对各行进行比较。
        //形如冒泡法.
        //输出比较后的第一行.
        char* temp;
        char *s[]={total_cmp_str3[0],total_cmp_str3[1],total_cmp_str3[2],total_cmp_str3[3]};
        for(int i=0;i<array_num;i++)
                for(int j=i+1;j<array_num;j++)
                        if(strcmp(s,s[j])>0){  
                                temp=s;
                                s=s[j];
                                s[j]=temp;
                        }
                        cout<<s[0]<<endl;
}

void rolling(char* Pstr1,char* Pstr2,char* Pstr)  
{
        //形如,"348" "67".
        //"348"通过改变指针指向和"67"的第一个字符进行比较,
        int state=1;
        int cut_i=0;
        char* temp;       
        int r_s1=s1,r_s2=s2;

        while(state)
        {
                //如果大于,等于且"348"不是最后一个字符的时候.
                //则是在"8"的位置,"8"存储到str中.并计算出截断以后的字符个数cut_i;
                if(*Pstr1>*Pstr2)   
                {
                        temp=Pstr1;       //保存当前位置.  
                        while(*Pstr1!='\0')  {
                                *Pstr++=*Pstr1++;
                                cut_i++;        
                        }
                        Pstr1=temp;        
               
                        //根据"67"的长度,把它粘贴到"34."即"8"的位置.
                        while(r_s2--) {
                                *Pstr1++=*Pstr2++;
                        }
                        r_s2++;
                       
                        //存储的数据补回.
                        Pstr=str;
                        while(cut_i--) {
                                *Pstr1++=*Pstr++;
                        }
                        *Pstr1='\0';
                        //                        cout<<str1<<endl;
                        copy_string(str1);
                        state=0;
                }
                //如果小于,则移动"348"的指针.
                else if(*Pstr1<=*Pstr2&&*(Pstr1+1)!='\0')  
                {
                        Pstr1++;
                }
                else if(*Pstr1==*Pstr2&&*(Pstr1+1)!='\0'&&*(Pstr2+1)!='\0'){
                        ++Pstr1;
                }
                else  //给个默认处理防止出错.
                {
                        strcat(str1,str2);
                        copy_string(str1);
                        state=0;       
                }
        }
       
}
//我都忘了针对什么了!???
void rolling3(char* Pstr1,char* Pstr2,char* Pstr) //Pstr1=str2 str2=str1;
{
        //它的接收参数和rolling相反.所以,r_s1=s2;
        //和默认处理要颠倒一样.
        //我为什么不把它整和到rolling中呢.
        int r_s1=s2,r_s2=s1;
        int state=1;
        int cut_i=0;
        char* temp;
        while(state)
        {
               
                if(*Pstr1>*Pstr2)   
                {
                        temp=Pstr1;        
                        while(*Pstr1!='\0')  {
                                *Pstr++=*Pstr1++;
                                cut_i++;        
                        }
                        Pstr1=temp;        
                       
                        //根据"67"的长度,把它粘贴到"34."即"8"的位置.
                        while(r_s2--) {
                                *Pstr1=*Pstr2;
                                *Pstr1++;
                                *Pstr2++;
                        }
                        r_s2++;              //为0;
                       
                        //存储的数据补回.
                        Pstr=str;
                        while(cut_i--) {
                                *Pstr1++=*Pstr++;
                        }
                        *Pstr1='\0';
                //                                cout<<str1<<endl;
                        copy_string(str2);
                        state=0;
                }
               
                else if(*Pstr1<=*Pstr2&&*(Pstr1+1)!='\0')  
                {
                        Pstr1++;
                }
                else if(*Pstr1==*Pstr2&&*(Pstr1+1)!='\0'&&*(Pstr2+1)!='\0'){
                        ++Pstr1;
                }
                else  //给个默认处理防止出错.
                {
                        strcat(str2,str1);
                        copy_string(str2);
                        state=0;       
                }
        }
}
void rolling1(char* Pstr1,char* Pstr2)
{
        strcat(str1,str2);
        copy_string(str1);       
}
void rolling2(char* Pstr1,char* Pstr2)
{
        strcat(str2,str1);
        copy_string(str2);
        //                cout<<"rolling2#"<<str2<<endl;
}
void copy_string(char* Pstr1)
{
        for(int j=0;*Pstr1!='\0';j++)
        {
                total_cmp_str3[j]=*Pstr1++;
        }
        total_cmp_str3[j]='\0';
        i++;
}




[em4] [em4] [em4] [em4] [em4]

2

主题

50

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2010-6-10 13:30:00 | 显示全部楼层

Re:算法,让人很受挫折。。

你搞的也太复杂了……

这题目一位位的比较就可以了,就是找出第二个数字应该插在哪个位置,在纸上多画画

大于等于小于三种情况,画几次就清楚了

30

主题

89

帖子

91

积分

注册会员

Rank: 2

积分
91
 楼主| 发表于 2010-6-11 16:31:00 | 显示全部楼层

Re:算法,让人很受挫折。。

我畏惧了,求帮助。。
EA能通过吗?

30

主题

89

帖子

91

积分

注册会员

Rank: 2

积分
91
 楼主| 发表于 2010-6-11 16:36:00 | 显示全部楼层

Re:算法,让人很受挫折。。

算法大大,帮我脱离苦海呀,,泪奔。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 16:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表