算法竞赛入门经典第二版 第三章

P37 程序3-1
#include<stdio.h>
#define MAXN 1050000
int a[MAXN];
int main(int args,char **argc)
{
    int a[MAXN];  //内外有区别
    int x,n=0;
    while(scanf("%d",&x)==1)
        a[n++]=x;
    printf("%d\n",n);
    for(int i=1;i<n;i++)
        printf("%d ",a[n-i]);
    printf("%d",a[0]);
    return 0;
}

P39 开灯问题
#include<stdio.h>
int main()
{
    int Lamp[1005]={0};
    int n,k;
    scanf("%d %d",&n,&k);
    for(int i=1; i < k+1 ; i++)
        for(int j=1; j < n+1 ; j++)
        {
            if(j % i== 0 )
                Lamp[j-1]=!Lamp[j-1];

        }
    for(int i=0;i<n;i++)
        if(Lamp[i])
            printf("%d ",i+1);
    /*printf("\n");
    for(int i=0;i<n;i++)
        printf("%d ",Lamp[i]);*/
    return 0;
}

P39 蛇形填数
#include<stdio.h>
#define MAXN 20
int a[MAXN][MAXN]={0};
int main()
{
    int n=0,count=1;
    int x=0,y=0;
    scanf("%d",&n);
    x=0,y=n-1;
    a[0][n-1]=1;
    while(count<n*n)  //下 左 上 右 下 左 上 右......
    {
        while(!a[x+1][y]&&x+1<n) a[++x][y]=++count;  
        while(!a[x][y-1]&&y-1>=0) a[x][--y]=++count;
        while(!a[x-1][y]&&x-1>=0) a[--x][y]=++count;
        while(!a[x][y+1]&&y+1<n) a[x][++y]=++count;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%3d  ",a[i][j]);
        }
        printf("\n");
    }   
    return 0;
}

#include<stdio.h>
int s[12][12]={0};
int main()
{
    int n,count=1;
    int x,y;
    scanf("%d",&n);
    x=0,y=n-1;
    s[0][n-1]=1;
    while(count<n*n)
    {
        while(!s[x+1][y]&&x+1<n) s[++x][y]=++count;
        while(!s[x][y-1]&&y-1>=0) s[x][--y]=++count;
        while(!s[x-1][y]&&x-1>=0) s[--x][y]=++count;
        while(!s[x][y+1]&&y+1<n) s[x][++y]=++count;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            printf("%3d ",s[i][j]);
        printf("\n");
    }
    return 0;
}

P41 竖式问题
#include<stdio.h>
#include<string.h>
int main()
{
    int a,b,c,d,e;
    int x,y,z;
    char s[20],buf[99];
    int count=0;
    scanf("%s",s);
    for(int abc=100;abc<1000;abc++)
    {
        for(int de=10;de<100;de++)
        {
            int x=abc*(de/10),y=abc*(de%10),z=abc*de;
            sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);
            int flag=1;
            for(int i=0;i< strlen(buf);i++)
                if(strchr(s,buf[i])==NULL)  
                    flag=0;
            if(flag)
            {
                printf("<%d>\n",++count);
                printf("%5d\nx%4d\n-----\n%5d\n%4d\n-----\n%5d\n",abc,de,x,y,z);
            }
        }
    }
    printf("The number of solutions = %d\n",count);
    return 0;
}

P45 例题3-1  Bug 空格结束
#include<stdio.h>
#include<string.h>
char s[100];
int main()
{
    scanf("%s",s);
    int n=strlen(s);
    printf("%d\n",n);
    int flag=0;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='"')
        {
            flag=!flag;
            if(flag)
                printf("“");
            else
                printf("”");
        }
        else
            printf("%c",s[i]);
    }
    printf("\n");
    return 0;
}

P45  例题3-1  Tex
#include<stdio.h>
#include<string.h>
int main()
{
    int c,q=1;
    while((c=getchar())!=EOF)  //getchar返回值    fgetc(stdin)
    {
        if(c=='"')
        {
            printf("%s",q?"“":"”");  //字符串
            q=!q;
        }
        else
            printf("%c",c);  //字符
    }
    return 0;
}

P47  例题3-2  QWERTYU
#include<stdio.h>
#include<string.h>
char s[]="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";  // \\才是\
int main()
{
    int n=strlen(s);
    printf("%d\n",n);
    int temp;  //注意getchar返回值是int
    while((temp=getchar())!=EOF)
    {
        int i;
        for(i=0;i<n;i++)
        {
            if(temp==s[i])
            {
                printf("%c",s[i-1]);
                break;
            }   
        }
        if(i==n)  //==写成=
            printf("%c",temp);
            //putchar(temp);
    }
    return 0;
}

P48 回文词 镜像词  问题程序
#include<stdio.h>
#include<string.h>
#define MAXN 100
//char s[]="AAB C D E3F G HHIIJLK LJMMN OOP Q R S2TTUUVVWWXXYYZ5112S3E4 5Z6 7 889 ";   //此处有bug
char s[]="E3JLLJSZ52S3E5Z";
char a[MAXN];
char b[MAXN];
char c[MAXN];
int main()
{   
    int n=0;
    char x;
    while(scanf("%s",&a)==1)
    {
        for(int i=0;i<strlen(a);i++)
        {
            b[i]=a[n-1-i];
            for(int j=0;j<strlen(s);j++)
            {
                if(i>=(strlen(a))/2)
                {
                    c[i]=a[n-1-i];
                    continue;
                }
                if(!strchr(a[i],s[j]))
                {
                    c[i]=s[j+1];
                }
            }
        }
        int flag1=strcmp(a,b),flag2=strcmp(a,c);
        if(!flag1&&!flag2)
            sprintf("%s -- is a not a palindrome.\n\n",a);
        else if(flag1&&!flag2)
            sprintf("%s -- is a regular palindrome.\n\n",a);
        else if(!flag1&&flag2)
            sprintf("%s -- is a mirrored string.\n\n",a);
        else
            sprintf("%s -- is a mirrored palindrome.\n\n",a);

    }   
    return 0;
}

#include<stdio.h>
#include<string.h>
char s[100];
//char TAB[]="AAE3HHIIJLLJMMOOS2TTUUVVXXYYZ5112S3E5Z88";  //JLLJ bug  L>L
char TAB[]="AEHIJLMOSTUVWXYZ123588ZES15YXWVUT2OMJLIH3A";
char a[100];
int main()
{
    while(scanf("%s",s)==1)
    {
        int n=strlen(s);
        //printf("%d\n",n);
        int flag1=1,flag2=1,flag3=0;
        for(int i=0;i<n;i++)
        {
            //回文
            if(s[i]!=s[n-1-i])
            {
                flag1=0;
            }   
            //镜像
            for(int j=0;j<strlen(TAB);j++)
            {
                if(i>n/2)
                    break;
                if(s[i]==TAB[j])  //索引表格是对称的
                {
                    flag3=1;
                    if(s[n-1-i]!=TAB[strlen(TAB)-1-j])  
                    {
                        flag2=0;
                        break;
                    }               
                }           
            }
            if(!flag3)
            {
                flag2=0;
            }
        }
        if(!flag1&&!flag2)
            printf("%s -- is a not a regular string.\n",s);
        else if(flag1&&!flag2)
            printf("%s -- is a regular palindrome.\n",s);
        else if(!flag1&&flag2)
            printf("%s -- is a mirrored string.\n",s);
        else
            printf("%s -- is a mirrored palindrome.\n",s);
    }
    return 0;
}

P50  例题3-4 数字游戏
#include<stdio.h>
#include<string.h>
#define MAXN 1010
int main()
{
    int n=0;
    int number=0;
    int flag=1;
    char ref[MAXN];
    char temp[MAXN];
    while(scanf("%s",temp)==1)
    {
        if(!n)           //n
        {
            n=temp[0]-'0';
            printf("n: %d\n",n);
            continue;
        }           
        int count1=0,count2=0,count3=0;
        if(flag)  //answer
        {
            printf("n: %d\n",n);
            int j=0;
            for(int i=0;i<strlen(temp);i++)
            {
                if('0'<=temp[i]&&temp[i]<='9')
                {
                    ref[j++]=temp[i];
                }
            }
            printf("%s\n",ref);
            //sprintf("%s\n",temp);  //输出到字符串
            flag=0;
            continue;
        }
        //else      //input
        //{
        //  for(int i=0;i<n;i++)
        //  {
        //      if(ref[i]==temp[i])
        //      {
        //          count1++;
        //      }
        //      for(int j=0;j<n;j++)
        //      {
        //          if(ref[i]==temp[j])
        //          {
        //              count2++;
        //              break;
        //          }
        //      }
        //      if(temp[i]==0)
        //      {
        //          count3++;
        //      }
        //  }
        //}
        //if(count3==n)  //全0
        //{
        //  n=0,flag=1;
        //  count1=0,count2=0,count3=0;
        //  break;
        //}
        number++;
        //printf("Case: %d\n",number);
        //sprintf("%s\n",temp);
        n=0,flag=1;
        count1=0,count2=0,count3=0;
    }
    return 0;
}

P50  例题3-4 猜数字游戏
#include<stdio.h>
#define MAXN 1005
char temp[MAXN];
char ref[MAXN];
int main()
{
    int n=1,flag=1,count=0;
    while(scanf("%d",&n)==1&&n)
    {
        for(int i=0;i<n;i++) scanf("%d",&ref[i]);
        printf("ref: ");
        for(int i=0;i<n;i++) printf("%d ",ref[i]);              
        printf("\n");
        for(;;)
        {
            int a=0,b=0;
            for(int i=0;i<n;i++)
            {
                scanf("%d",&temp[i]);
                if(ref[i]==temp[i])  a++;
            }
            if(temp[0]==0)  break;
            for(int d=1;d<=9;d++)  //1-9 统计每个数字出现的次数 最小的即为b值
            {
                int c1=0,c2=0;
                for(int i=0;i<n;i++)
                {
                    if(ref[i]==d)
                        c1++;
                    if(temp[i]==d)
                        c2++;
                }
                if(c1<c2)
                    b+=c1;
                else
                    b+=c2;
            }
            printf("Game %d:\n",++count);
            printf("  (%d,%d)\n",a,b-a);
        }

    }
    return 0;
}

P52 例题3-5  生成元
#include<stdio.h>
int main()
{
    int n;
    int a,b,c,d,e;
    while(scanf("%d",&n)==1)
    {
        int i=0;
        for(i=0;i<n;i++)  //最小解 从0寻
        {
            a=i/10000;
            b=i/1000%10;
            c=i/100%10;
            d=i/10%10;
            e=i%10;
            //printf("%d %d %d %d %d\n",a,b,c,d,e);
            if(n==(i+a+b+c+d+e))
                break;
        }
        if(i<n)
            printf("%d\n",i);
        else
            printf("0");
    }
    return 0;
}

//P52 例题 3-6 字典序
#include<stdio.h>
#define MAXN 105
int main()
{
    int n=0;
    char s[MAXN];
    scanf("%d",&n);
    while(1)
    {
        scanf("%s",s);

    }
    return 0;
}

P55 思考题
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
    题目一
    1
    /*int n=0,x;
    while(scanf("%d",&x)==1)
        n++;
    printf("%d\n",n);*/

    2
    /*int x,n=0,s=0;
    int min,max;
    int flag=1;
    while(scanf("%d",&x)==1)
    {
        s=s+x;
        n++;
        if(flag)
            min=max=x,flag=0;
        if(min>x)
            min=x;
        if(max<x)
            max=x;
    }
    printf("%d %d %.2f\n",min,max,(float)s/(float)n);*/

    3
    int s[100];
    int n=0;
    while(scanf("%d",&s[n++])==1);  //空格结束
    printf("%s\n",s);
    int err=100,p_err=100;
    int flag=1,i=0,j=0;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n-1;j++)
        {
            /*if(flag)
            {
                p_err=s[i]-s[j];
                err=p_err;
                flag=0;
            }*/
            err=s[i]-s[j];
            if(err==0)
            {
                printf("err : %d ,%d %d\n",err,s[i],s[j]);
                break;
            }   
            if(abs(err)<abs(p_err)) 
                p_err=err;
            printf("%d %d\n",p_err,err);
        }
        printf("err : %d ,%d %d\n",err,s[i],s[j]);
        if(err==0)
            break;
    }
    printf("err : %d ,%d %d\n",abs(err),s[i],s[j]);

    /*int n=0,x;
    int s[100];
    while(scanf("%d",&x)==1)
    {
        s[n]=x;
        n++;
    }
    for(int i=0;i<n;i++)
        printf("%d ",s[i]);
    printf("\n");
    int p_err,err;
    int flag=1;
    int i=0,j=0;
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(flag)
            {
                p_err=s[0]-s[1];
                flag=0;
            }
            err=s[i]-s[j];
            if(abs(err)<abs(p_err))
                p_err=err;
        }
    }
    printf("%d\n",abs(p_err));*/


    4
    int x,max1,max2,flag=1;
    while(scanf("%d",&x)==1)
    {
        if(flag)
        {
            max1=x,scanf("%d",&max2),flag=0;
            int t=0;
            if(max1<max2)
                t=max1,max1=max2,max2=t;
            scanf("%d",&x);  //max1 max2 x 5 4 5  bug
        }
        if(max1<x)
            max2=max1,max1=x;  //max
        else
            if(max2<x)
                max2=x;
        printf("max1 :%d  max2: %d\n",max1,max2);
    }
    printf("submax: %d\n",max2);

    5  求方差
    /*int n=0;
    float a[100];
    float x,S=0;
    while(scanf("%f",&x)==1)
    {
        a[n]=x;
        S=S+x;
        n++;
    }
    x=S/(float)n;
    S=0;
    for(int i=0;i<n;i++)
    {
        S=S+(a[i]-x)*(a[i]-x);
    }
    S=S/(float)n;
    printf("Variance: %.3f\n",S);*/

    6
    int n=0,count=0;
    float a[100];
    float x,s=0;
    while(scanf("%f",&x)==1)
    {
        a[n]=x;
        s=s+x;
        n++;
    }
    s=s/(float)n;
    for(int i=0;i<n;i++)
    {
        if(a[i]<=s)
            count++;
    }
    printf("%d\n",count);

    题目2
    /*int x,count=0;
    while((x=getchar())!=EOF)
    {
        if(x=='1')
            count++;
    }
    printf("%d\n",count);*/

    /*int n=0;
    char x;
    while((x=getchar())!=EOF)
    {
        if(x=='1')
            n++;
    }
    printf("%d\n",n);*/

    return 0;
}

P57 习题 
#include<stdio.h>
int main()
{

    return 0;
}
3-1 得分
#include<stdio.h>
#include<string.h>
#define MAXN 90
int main()
{
    int sore=0,count=0;
    char s[MAXN];
    scanf("%s",s);
    for(int i=0;i<strlen(s);i++)
    {   
        if(s[i]=='O')
        {
            count++;
            sore=sore+count;
        }
        else
            count=0;
    }
    printf("%d\n",sore);
    return 0;
}

3-2 分子量
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 30
int main()
{
    char s[MAXN];
    float tab[5]={12.01,1.008,16.00,14.01};  //C H O N
    int n=0;
    float mol=0;
    scanf("%s",s);
    n=strlen(s);  //注意
    printf("%d\n",n);
    printf("%s\n",s);
    for(int i=0;i<=n;i++)
    {
        if(isalpha(s[i]))
        {
            if(i<=n&&isdigit(s[i+1]))
            {
                switch(s[i])
                {
                    case 'C':mol=mol+tab[0]*(s[i+1]-'0');break;  //注意
                    case 'H':mol=mol+tab[1]*(s[i+1]-'0');break;
                    case 'O':mol=mol+tab[2]*(s[i+1]-'0');break;
                    case 'N':mol=mol+tab[3]*(s[i+1]-'0');break;
                }
                printf("%c%d\n",s[i],s[i+1]-'0');
                printf("%.3f\n",mol);
                i++;  //注意
            }   
            else
            {
                switch(s[i])
                {
                    case 'C':mol=mol+tab[0];break;
                    case 'H':mol=mol+tab[1];break;
                    case 'O':mol=mol+tab[2];break;
                    case 'N':mol=mol+tab[3];break;
                }
                printf("%c\n",s[i]);
                printf("%.3f\n",mol);
            }
        }
    }
    printf("%.3fg/mol\n",mol);
    return 0;
}

3-3 数数字
#include<stdio.h>  //思考简化算法  暴力破解
int main()
{
    int n=0;
    int s[10]={0};
    int x[6]={0};
    for(int i=1;i<=10000;i++)
    {
        x[0]=i/10000;
        x[1]=i/1000%10;
        x[2]=i/100%10;
        x[3]=i/10%10;
        x[4]=i%10;
        for(int j=0;j<5;j++)
        {
            s[x[j]]++;
        }
    }
    for(int i=0;i<10;i++)
        printf("%d: %d\n",i,s[i]);
    /*printf("%s\n",s);*/
    return 0;
}

3-3 
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int cnt(int n, int x)
{
    int res = 0;
    int fact = 1, high = n/10, crt = n%10, low = 0;
    while (high || (x && crt >= x)) {
        //printf("%d %d %d %d\n", fact, high, crt, low);
        res += high*fact;
        if (x == 0) res -= fact;
        if (crt > x) res += fact;
        if (crt == x) res += (low+1);
        low += fact*crt;
        crt = high%10;
        high /= 10;
        fact *= 10;
    }
    return res;
}
int main(void)
{
    int t, n;
    cin >> t;
    while (t --) {
        cin >> n;
        for (int i = 0; i < 10; i ++) {
            printf("%d%c", cnt(n, i), i == 9 ? '\n' : ' ');
        }
    }

    return 0;
}

3-4 周期串 
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 100
char s[MAXN];
int main()
{
    scanf("%s",s);
    int l=1,n=strlen(s);
    int flag=1;
    for(int i=1;i<strlen(s);i++)
    {
        if(s[i]==s[0])  //posiable head
        {
            l=i-0;      //posiable shortest long
            flag=1;
            if(n%l!=0)
                continue;  
            for(int j=0;j<l;j++)  //part1
            {
                for(int k=1;k<n/l;k++)  //each part
                {
                    if(s[j]!=s[j+k*l])
                        flag=0;
                }
                if(flag==0)
                    break;
            }
            printf("cycle: %d\n",l);
            for(int i=0;i<l;i++)
                printf("%c",s[i]);
            printf("\n");
        }
    }
    return 0;
}

3-5 riddle
#include<stdio.h>
char s[6][6]={"TRGSJ","XDOKI","M VLN","WPABE","UQHCF"};
void draw(void)
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            printf("%c  ",s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
int main()
{
    draw();
    char order;
    int x=2,y=1;
    int n=1;
    //scanf("%c",&order);  //test
    //printf("%c\n",order);
    while((scanf("%c",&order)==1)&&(order!='0'))
    {

        char t;
        if(order=='\n')
            continue;
        switch(order)
        {
            case 'W':  //up
            {
                if(x!=0)
                {
                    t=s[x][y],s[x][y]=s[x-1][y],s[x-1][y]=t;
                    x=x-1;
                }
            }
            break;
            case 'S':  //down
            {
                if(x!=4)
                {
                    t=s[x][y],s[x][y]=s[x+1][y],s[x+1][y]=t;
                    x=x+1;
                }
            }
            break;
            case 'A':  //left
            {
                if(y!=0)
                {
                    t=s[x][y],s[x][y]=s[x][y-1],s[x][y-1]=t;
                    y=y-1;
                }
            }
            break;
            case 'D':  //right
            {
                if(y!=4)
                {
                    t=s[x][y],s[x][y]=s[x][y+1],s[x][y+1]=t;
                    y=y+1;
                }
            }
            break;
            default :printf("This puzzle has no final configuration\n");
        }
        draw();
    }
    return 0;
}

3-5 riddle
#include<stdio.h>
char s[6][6];
void draw(void)
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            printf("%c ",s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
int main()
{
    int x=0,y=0;
    char order;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            scanf("%c",&order);
            if(order!='\n'&&order!='\r')  //filter \n \r
            {
                s[i][j]=order;
            }
            else 
            {
                scanf("%c",&s[i][j]);     //next code
            }
            if(s[i][j]==' ')  //only one block
            {
                x=i,y=j;
            }
        }
    }
    draw();
    while((scanf("%c",&order)==1)&&(order!='0'))
    {
        if(order=='\n'||order=='\r')
            continue;
        char t;
        switch(order)
        {
            case 'A':
            {
                if(x!=0)
                {
                    t=s[x][y],s[x][y]=s[x-1][y],s[x-1][y]=t;
                    x=x-1;
                }
            }break;
            case 'B':
            {
                if(x!=4)
                {
                    t=s[x][y],s[x][y]=s[x+1][y],s[x+1][y]=t;
                    x=x+1;
                }
            }break;
            case 'L':
            {
                if(y!=0)
                {
                    t=s[x][y],s[x][y]=s[x][y-1],s[x][y-1]=t;
                    y=y-1;
                }
            }break;
            case 'R':
            {
                if(y!=4)
                {
                    t=s[x][y],s[x][y]=s[x][y+1],s[x][y+1]=t;
                    y=y+1;
                }
            }break;
            default:printf("This Puzzle has not final configuration.\n");
        }
        draw();
    }
    return 0;
}

3-6 纵横字谜
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char s[10][10];
char tab[10][10];
#define l 5
int n=1;
void draw1(void)
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            printf("%c  ",s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
void draw2(void)
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            if(tab[i][j]!='*')
                printf("%2d  ",tab[i][j]);
            else
                printf("    ");
        }
        printf("\n");
    }
    printf("\n");
}
int main()
{   
    char order;
    for(int i=0;i<l;i++)
    {
        for(int j=0;j<l;j++)
        {
            scanf("%c",&order);
            if(order!='\n'&&order!='\r')
            {
                s[i][j]=order;
                //break;   //next line
            }
            else
            {
                scanf("%c",&s[i][j]);
            }
        }
    }
    draw1();
    for(int i=0;i<l;i++)
    {
        for(int j=0;j<l;j++)
        {
            if(isalpha(s[i][j]))
            {
                tab[i][j]=n;
                n++;
            }
            else
            {
                tab[i][j]='*';
            }
        }
    }
    draw2();
    return 0;
}

3-7 frequency of DNA

3-8 repeating decimals
#include<stdio.h>
void main()
{
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值