在二维数组中打印各种字符串构造

时间:2011-09-24 16:38:56

标签: c string

我目前正在尝试编写c中的蛋白质折叠项目。 在哪里我会得到一个3-4长度的字符串,让我们说BWB或BBWW ...... 我必须将此字符串存储在二维数组中,并使用此字符串打印所有可能的组合。

如果字符串的长度为n,则矩阵的长度为2n。我将第一个元素存储在数组的中心。

到目前为止,我所尝试的内容如下─ 我能够打印特定输入的构造数量 - 比方说3字母字符串它将生成12个组合...对于4它将生成36个组合..就像这个..

所以我的第一个字母ll位于矩阵的中心,然后第二个字可以位于这一个的任何位置 - 顶部,左侧,右侧,下方......并且取决于第二个,第三个可以位于顶部,右侧,左边或任意3种组合...

总共有12种组合..

到目前为止,我尝试了很多东西......无论我尝试过什么,都是

#include<string.h>
#include<math.h>
#include<stdio.h>


main()
{
    int n=3;
    //printf("enter the number of inputs:\t");
    //scanf("%d",&n);

    int i=4;
    int temp=pow((i-1),(n-2));
    int comb=i*temp;
    //printf("total number of combination is : %d",comb);

    char str[3]="ABC";
    int size=2*n;
    int p;
    char mat[size][size];
    int j,k;
    int a=size/2;
    int b=size/2;

    for(j=0;j<size;j++)
    {
        for(k=0;k<size;k++)
        {
            mat[j][k]='*';
        }
    }

    mat[a][b]=str[0];
    int q;
    int r;
    for(r=1;r<3;r++)
    {
        for(q=1;q<=4;q++)
        {
            switch(q)
            {
            case 1:a=a+1;
            break;
            case 2:a=a-1;
            break;
            case 3:b=b+1;
            break;
            case 4:b=b-1;
            break;
            }
            mat[a][b]=str[r];
        }
    }



    for(p=0;p<comb;p++)
    {
        for(j=0;j<size;j++)
        {
            for(k=0;k<size;k++)
            {
                printf("%c",mat[j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }

    printf("total number of combination is : %d",comb);

}

我得到的输出是

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

******
******
******
***CC*
***C**
******

total number of combination is : 12

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您正在填充数组一次,然后打印12次。大概你想用12种不同的方式填写它并打印出来。

通常,这种类型的问题是通过递归完成的:

  1. 将字符串的当前字符放在可能的位置,如果已经填充,则跳过该位置。
  2. 如果这是字符串中的最后一个字符,请打印出数组。否则,重复下一个角色。
  3. 删除刚放置的角色。
  4. 转到1
  5. 对于重复出现的函数,您可能希望传入数组中的当前位置以及字符串中的下一个索引。像

    这样的东西
    void do_next(int i, int j, int str_index)
    {
        if(str_index >= strlen(str))
        {
             print_array();
             return;
        }
    
        if(arr[i+1][j] == '*')
        {
            arr[i+1][j] = str[str_index];
            do_next(i+1, j, str_index+1);
            arr[i+1][j] = '*';
        }
        // three similar blocks for the other positions
        // don't use "else". Each block should be executed once
    }