【问题标题】:Matrix adjacent elements combinations in C++C ++中的矩阵相邻元素组合
【发布时间】:2012-11-25 15:28:54
【问题描述】:

我有这个矩阵:

A B C

D E F

G H I

我想得到相邻单元格和对角线单元格的所有可能组合,长度为3,例如:

从A开始:

 - *ABC* right right
 - *ABE* right down
 - *ABF* right diagonal-right
 - *ABD* right diagonal-left
 - ecc ecc

我尝试创建一个名为“letera”的新类,将字母作为键,并使用一个成员来指示指向右、左、下、上 ecc 的指针。还有一个叫做“sequenza”的成员,一个连接它所接触到的每个字母的字符串。

例如,如果 a 作为键,“B”,我有 B->down == *E,B->left == *A,B->right == *C 等等... 它有效。然后我为每个字母设置一个计数器:当它到达 3 时,它应该停止确定组合。

然后是问题的核心:每个字母要遵循的路径...我尝试创建一个递归函数,但它不起作用。

你能帮我看看这个还是建议我用另一种方式?

非常感谢。

代码:

    void decisione(lettera *c) {

            if (c == nullptr) return ;

            c->count++;
            c->sequenza = c->sequenza + c->key;

            if (c->count == 2) 
                    cout << "\n" << c->sequenza; 
                 //the sequence of letters accumulated in every call
            decisione(c->Up);
            decisione(c->Down);

        }

它给了我例如 AAA 和 BBB,然后它崩溃了 =(

【问题讨论】:

  • 不会B -&gt; downE 吗?
  • 是的,这是真的,谢谢。错误...编辑了它
  • 在调试器中运行以隔离和修复崩溃。
  • 完成了,当我没有崩溃时,它只给我 AAA BBB ecc。所以我的解决方案在逻辑上是行不通的。

标签: c++ recursion matrix


【解决方案1】:

从A开始,你能去哪里? B和D。假设你去B,现在,你能去哪里? A、C 和 E。你已经在 A 并且不想返回,所以你只有 C 和 E。假设你选择 C,因为你已经选择了三个字母,所以函数停止然后你选择 E依此类推(我没有选择对角邻居),这是程序:

#include <cstdio>
#include <cstdlib>

int a[] = {-1,-1,-1,0,0,1,1,1}, b[] = {-1,0,1,-1,1,-1,0,1},cont;
char s[3],mat[3][3];
bool flag[9];

void display() {
  for(int i = 0; i < 3; ++i) printf("%c",s[i]);
  puts("");
}

void show(int x,int y) {//You are in mat[x][y]
  s[cont] = mat[x][y];
  if(cont == 2) {
    display();
    return;
  }
  flag[mat[x][y] - 'A'] = true;
  int xx,yy;
  for(int i = 0; i < 8; ++i) {
    xx = x + a[i], yy = y + b[i];
    if(0 <= xx and xx < 3 and 0 <= yy and yy < 3 and !flag[mat[xx][yy] - 'A']) {
      ++cont;
      show(xx,yy);
      --cont;
    }
  }
  flag[mat[x][y] - 'A'] = false;

}

int main() {
  cont = 0;
  for(int i = 0; i < 3; ++i) {
    for(int j = 0; j < 3; ++j) {
      mat[i][j] = ('A' + 3*i + j);
    }
  }
  for(int i = 0; i < 3; ++i) {
    for(int j = 0; j < 3; ++j) {
      show(i,j); //You start from mat[i][j]: {'A','B','C',...,'I'}
    }
  }
  return 0;
}

【讨论】:

  • 非常感谢你的回答,但我真的不明白你的代码=(
  • 究竟哪一部分你不明白?
  • 我不明白“标志”的用法以及您为什么这样做.. - 'A'...您的解决方案的总体思路是什么?
  • 我使用 flag 来记录我到目前为止使用的字母,我放 - 'A' 因为数组只支持从 0 到 8 的索引,如果我放 flag['A']它会尝试访问超出限制的数组,这就是我输入 - 'A' 的原因,当它检查 'A' 时,它会检查 flag['A' - 'A'] = flag[0]。我在代码之前解释了算法的思想,但是如果您不理解,请继续提问:D
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 2015-05-20
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多