0

我想知道是否有一种有效的方法可以在 C++ 中生成一组这 4 个数字:

(0,2,1,0) ; // A
(1,2,2,0) ; // B
(2,2,3,0) ; // C
(4,1,0,3) ; // D
(4,2,5,0) ; // E
(5,1,1,3) ; // F
(5,2,6,0) ; // G
(6,1,2,3) ; // H
(6,2,7,0) ; // I
(7,1,3,3) ; // J
(8,1,4,3) ; // K
(8,2,9,0) ; // L
(9,1,5,3) ; // M
(9,2,10,0) ; // N
(10,1,6,3) ; // O
(10,2,11,0) ; // P
(11,1,7,3) ; // Q
(12,1,8,3) ; // R
(12,2,13,0) ; // S
(13,1,9,3) ; // T
(13,2,14,0) ; // U
(14,1,10,3) ; // V
(14,2,15,0) ; // W
(15,1,11,3) ; // X
(16,1,12,3) ; // Y
(16,2,17,0) ; // Z
(17,1,13,3) ; // A1
(17,2,18,0) ; // B1
(18,1,14,3) ; // C1
(18,2,19,0) ; // D1
(19,1,15,3) ; // E1

" 16  Y  12  R  8  K  4  D  0"    
"  Z      S     L     E     A"    
" 17 A1  13  T  9  M  5  F  1"    
" B1      U     N     G     B"    
" 18 C1  14  V  10 O  6  H  2"    
" D1      W     P     I     C"    
" 19 E1  15  X  11 Q  7  J  3"    

将上图中的数字视为一个正方形,将字母 A 到 E1 视为相邻正方形边缘的交点。在上面的列表中,每个集合 (A,B,C..) 有 4 个数字。位置 1 和 3 处的数字代表方形件数。位置 2 和 4 的数字代表方形边缘的类型(顶部 - 0 ,右侧 - 1,底部 - 2,左侧 - 3 )。第一组数字表示交点A。如上图所示,它是正方形数字0(底边--2)和正方形数字1(顶边--0)的交点。所以,A是0,2 ,1,0 。

类似地,B 是方形块 1(底部边缘 -- 2)和方形块 2(顶部边缘 -- 0)的交集。因此 B 是 (1,2,2,0)。类似地,C 是 (2,2,3,0) -- 正方形块 2(底边 - 2)和正方形块 3(顶边 - 0)的交点

问题是如何在 C++ 中生成这些数字

4

1 回答 1

1

诀窍是按行和列遍历数组:

 4  3  2  1  0
---------------
16 12  8  4  0 | 0
17 13  9  5  1 | 1
18 14 10  6  2 | 2
19 15 11  7  3 | 3

例如,第 1 列和第 2 行表示正方形 6。

为了以正确的顺序迭代正方形,我们使用这样的嵌套循环:

int num_cols = 5;
int num_rows = 4;
for(int col=0; col<num_cols ; ++col)
{
  for(int row=0; row<num_rows ; ++row)
  {
    cout << "this is column " << col << ", row " << row << endl;
  }
}

现在我们只需要弄清楚在特定位置做什么。正方形的编号是多少?您应该很容易看到它是col*num_rows + row. 并且下面的正方形的编号(如果有的话)是,右边col*num_rows + row + 1的行号(如果有的话)是。因此,例如,如果是 1 和2,则要报告的边是(col-1)*num_rows + rowcolrow

(6,1,2,3)
(6,2,7,0)

够了吗?

于 2013-10-08T08:04:51.113 回答