0

まず第一に、私は C++ プログラミングの初心者です。次に、解決すべき問題があり、頭が痛くなるようです。こんなふうになります。コードにchar[3][14]( user_in) があり、ユーザーから入力を取得して入力します。ユーザー タイプのみ'1','x','2','*'。例えば:

1**
1*2
**2
*x*
1**
1**
*x2
**2
**2
1x*
1**
*x*
**2
1**
1x2

次に、この配列を別の配列に変換しますint[3][14](user_in_trコード内)。*私が置くすべて0のために、1私が置くために1、私が置くために、x私が置く2ため23。そう:

1**  100
1*2  103
**2  003
*x*  020
1**  100
1**  100
*x2  023
**2  003
**2  003
1x*  120
1**  100
*x*  020
**2  003
1**  100
1x2  123

私がやりたいことは、各行から 1 つの要素を取得して、可能なすべての合計を数えることです。要素が 0 であってはならないことに注意してください。したがって、0 がある場合はスキップします。私の例では、次のようになります。

First:  1+1+3+2+1+1+2+3+3+1+1+2+3+1+1=26
Second: 1+1+3+2+1+1+2+3+3+1+1+2+3+1+2=27
Third:  1+1+3+2+1+1+2+3+3+1+1+2+3+1+3=28
Fourth: 1+1+3+2+1+1+2+3+3+2+1+2+3+1+1=27

等々...

最大合計 = 42 (14x3)、最小合計 = 14 (14x1)

また、追加された数字を表示したいと思います。
私はいくつかのコードを思いつきましたが、結果は私が期待したものではありません。ここに私のコードがあります:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>


using namespace System;
using namespace std;

int main(array<System::String ^> ^args)
{
    char user_in[3][14];
    int user_in_tr[3][14]
    int i,j;
    int count0,count1,count2,count3,count4,count5,count6,count7,count8,count9,count10,count11,count12,count13;
    int sum;

    for(i=0;i<14;i++)
    {
        for(j=0;j<3;j++)
        {
            scanf("%c",user_in[j][i]);
        }
    }

    for(i=0;i<14;i++)
    {
        for(j=0;j<3;j++)
        {
            if(user_in[j][i]=='*')
            {
                user_in_tr[j][i]=0;
            }
            else if(user_in[j][i]=='1')
            {
                user_in_tr[j][i]=1;
            }
            else if(user_in[j][i]=='x')
            {
                user_in_tr[j][i]=2;
            }
            else
            {
                user_in_tr[j][i]=3;
            }
        }
    }

   for(count0=0;count0<3;count0++)
   {

     for(count1=0;count1<3;count1++)
     {

      for(count2=0;count2<3;count2++)
      {

       for(count3=0;count3<3;count3++)
       {

        for(count4=0;count4<3;count4++)
        {

         for(count5=0;count5<3;count5++)
         {

          for(count6=0;count6<3;count6++)
          {

           for(count7=0;count7<3;count7++)
           {

            for(count8=0;count8<3;count8++)
            {

             for(count9=0;count9<3;count9++)
             {

              for(count10=0;count10<3;count10++)
              {

               for(count11=0;count11<3;count11++)
               {

                for(count12=0;count12<3;count12++)
                {

                 for(count13=0;count13<3;count13++)
                 {
                  sum=0;

                  if(user_in[count0][0]!=0&&user_in[count1][1]!=0&&user_in[count2][2]!=0&&user_in[count3][3]!=0&&user_in[count4][4]!=0&&user_in[count5][5]!=0&&user_in[count6][6]!=0&&user_in[count7][7]!=0&&user_in[count8][8]!=0&&user_in[count9][9]!=0&&user_in[count10][10]!=0&&user_in[count11][11]!=0,user_in[count12][12]!=0&&user_in[count13][13]!=0)
                  {
                   sum=user_in[count0][0]+user_in[count1][1]+user_in[count2][2]+user_in[count3][3]+user_in[count4][4]+user_in[count5][5]+user_in[count6][6]+user_in[count7][7]+user_in[count8][8]+user_in[count9][9]+user_in[count10][10]+user_in[count11][11]+user_in[count12][12]+user_in[count13][13];

                   printf("%d",sum);

                   printf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d",user_in[count0][0],user_in[count1][1],user_in[count2][2],user_in[count3][3],user_in[count4][4],user_in[count5][5],user_in[count6][6],user_in[count7][7],user_in[count8][8],user_in[count9][9],user_in[count10][10],user_in[count11][11],user_in[count12][12],user_in[count13][13]+"\n");
                  }
                 }
                }
               }
              }
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }

   system("PAUSE");
   return 0;
}
4

1 に答える 1

0

問題を解決する方法の 1 つは、再帰を使用することです。常に良い方法とは限りませんが、この問題を再帰すると可読性が大幅に向上します (データを処理するための for ループは 1 つだけです)。

#include <iostream>
#include <vector>

typedef std::vector<unsigned> Row;
typedef std::vector<Row> Data;

void load_user_data(Data& data);
void calculate_sums(unsigned value, Data::const_iterator begin,
        Data::const_iterator end);

int main(int argc, char** argv)
{
    Data data;

    load_user_data(data);

    calculate_sums(0, data.begin(), data.end());

    return 0;
}

void load_user_data(Data& data)
{
    // WARNING: Untested, but should read data from user
    /*for (unsigned i = 0; i < 14; ++i)
    {
        Row temp;
        for (unsigned j = 0; j < 3; ++j)
        {
            char input = '\0';

            while (input == '\0')
            {
                std::cin >> input;
                switch (input)
                {
                case '1':
                    temp.push_back(1);
                    break;
                case 'x':
                    temp.push_back(2);
                    break;
                case '2':
                    temp.push_back(3);
                    break;
                case '*':
                    break;
                default:
                    input = '\0';
                }
            }
        }

        data.push_back(temp);
    }*/

    // Because I'm slightly lazy, the code bellow loads your data
    // into the vector Data.  If you had C++11 you could use
    // initializer lists.  If you want to try the code above,
    // comment out the code bellow.

    Row t;

    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(1); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(2); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(2); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(1); t.push_back(2); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);
    t.clear(); t.push_back(2); data.push_back(t);
    t.clear(); t.push_back(3); data.push_back(t);
    t.clear(); t.push_back(1); data.push_back(t);

    t.clear(); t.push_back(1); t.push_back(2); t.push_back(3);
    data.push_back(t);
}

void calculate_sums(unsigned value, Data::const_iterator begin,
        Data::const_iterator end)
{
    if (begin == end)
    {
        std::cout << value << std::endl;
        return;
    }

    for (Row::const_iterator entry = begin->begin();
            entry != begin->end(); ++entry)
    {
        calculate_sums(value + *entry, begin+1, end);
    }
}

追加された数値を表示したい場合はunsigned value、各反復で数値を追加するベクトルに置き換えることができ、合計とコンポーネントを表示できます。機会があれば、上記のコードに例を追加します。

編集: 次のコードは、完全な合計 (数値と結果の両方を含む) を出力します。前のコードとの唯一の違いは、後で表示できるように組み合わせを保存していることです。これは、std::vector(リスト) を関数に渡すことによって実現されますcalculate_sums(以前は、現在の合計値のみを渡しました)。お役に立てれば。

void calculate_sums(const Row& values, Data::const_iterator begin,
        Data::const_iterator end);

int main(int argc, char** argv)
{
    Data data;

    load_user_data(data);

    Row temp;
    calculate_sums(temp, data.begin(), data.end());

    return 0;
}

void load_user_data(Data& data)
{
    // Same as above
}

void calculate_sums(const Row& values, Data::const_iterator begin,
        Data::const_iterator end)
{
    if (begin == end)
    {
        int value = 0;
        for (unsigned i = 0; i < values.size(); ++i)
        {
            value += values[i];
            std::cout << values[i] << char((i < values.size()-1) ? '+' : '=');
        }
        std::cout << value << std::endl;
        return;
    }

    for (Row::const_iterator entry = begin->begin();
            entry != begin->end(); ++entry)
    {
        Row temp(values);
        temp.push_back(*entry);
        calculate_sums(temp, begin+1, end);
    }
}
于 2013-09-04T15:53:54.520 に答える