如何创建2D字符串数组的排列?

时间:2016-01-13 20:47:45

标签: c++

我有以下代码。我将每个框设置为1.现在我想一次设置3个框为0.如果不手动将每个框设置为1,我该怎么做?

是否有一个排列公式,将当时设置3为1?

content-wrap

打印这个看起来像。

struct __long
{
    size_type __cap_;
    size_type __size_;
    pointer   __data_;
};

现在我该如何打印

#include <iostream>
using namespace std;

int main()
{
  int array[2][2];
  for (int x = 0; x<2; x++) 
  {
        for (int y = 0; y<2; y++)
            array[x][y] = 1;
  }

 // display all cells to see that all of them are set to zero 
 cout << "diplaying" << endl;   
 for (int x = 0; x<2; x++)   
 {
    for (int y = 0; y<2; y++)
       cout << array[x][y] << " " ; 
    cout << endl;
 }

1   1

1   1

0   1          

0   0

1   0

0   0

不必单独设置它们吗?

3 个答案:

答案 0 :(得分:5)

就个人而言,我会将数组存储为大小为std::vector<int>的1D n*n。然后你可以非常简单地在它上面调用std::next_permutation()。 (值得注意的是,您不必使用std::vector;只要它在内存中是连续的,您就应该能够正确使用std::next_permutation()

你必须做的唯一事情就是你的排列逻辑&#34; 2D&#34;打印它的行为。但是,你的循环as-is应该正确处理,所以也没有问题。

编辑:重新阅读您的代码后,您无法按原样使用此代码。相反,您应该将1D std::vector初始化为0,除了位置0处的1之外。然后,这样的排列将产生您想要的输出。

此外,您的打印循环不会正确打印出阵列。你可能想要:

for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 2; ++j) {
        std::cout << vector[i*2+j] << " " ;
    }
    std::cout << std::endl;
}

答案 1 :(得分:0)

仔细阅读后,我用这种方式解释了你的问题: 你想从这个

1   1

1   1

到这个

0   1          

0   0

使用for子句。

如果你只是想让一个单元格保持不变......你可以保存它并在用0填充数组后恢复它。

memo = array[0][1];

for (int x = 0; x<2; x++) {
    for (int y = 0; y<2; y++) {
        array[x][y] = 0;
    }
}
array[0][1] = memo;

如果那是你想做的事。

&#34;字符串数组&#34;顺便说一句..?

答案 2 :(得分:-1)

我会编写一个打印全零的函数,除非需要打印实际值,然后使用不同的索引调用此函数以获得所需的效果。

#include <iostream>
using namespace std;
#define SZ 2
void printValue(int a [SZ][SZ], int x, int y)
{
    for(int i=0; i<SZ; ++i )
    {
        for(int j=0; j<SZ; ++j)
        {
            if(i==x && j==y) cout<<a[i][j];
            else cout<<"0";
            cout<<" ";
        }
        cout<<endl;
    }
}

现在您可以在for循环中使用此函数

int main()
{
  int arr[SZ][SZ];
  for (int x = 0; x<SZ; x++)
  {
        for (int y = 0; y<SZ; y++)
            arr[x][y] = 1;
  }

    // display all cells to see that all of them are set to zero
 cout << "diplaying" << endl;

 for (int x = 0; x<SZ; x++)
 {
    for (int y = 0; y<SZ; y++)
       cout << arr[x][y] << " " ;
    cout << endl;
 }

 //now display all combos:
 for(int i=0; i<SZ; ++i)
 {
     for(int j=0; j<SZ; ++j)
     {
         printValue(arr, i,j);    
     }
  cout<<"\n\n";
 }


}