从阵列打印路径?

时间:2013-11-17 20:43:12

标签: c arrays function math

我有一个2d数组a[3][3],程序读取数组上2个数字的2组ID。 我需要打印从一个数字到另一个数字的所有可能路径。

到目前为止,我知道如何找到每次存在多少条路径:

scanf("%d %d",&ai,&aj);
scanf("%d %d",&bi,&bj);

distance_i = bi - ai;
if(distance_i<0){distance_i=distance_i*-1;}
distance_j = bj - aj;
if(distance_j<0){distance_j=ap_j*-1;}
path = 1+(distance_i*distance_j);

例如,如果数组a是:

1 2 3
4 5 6
7 8 9

使用

input_1: 0,0
input_2: 1,2

输出必须是:

there are 3 possible paths:
    a) 1,2,5,8
    b) 1,4,5,8
    c) 1,4,7,8

但是我找不到打印它们的方法。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

从位置[v1] [h1]到位置[v2] [h2]

移动种类是:DOWN, RIGHT

宽度为:(v2-v1) * DOWN

高度为:(h2-h2) * RIGHT

=&GT;所有路径选择操作列表:[width, height] = [(v2-v1) * DOWN, (h2-h2) * RIGHT]

示例:从位置[0] [0]到位置[2] [1]

动作列表= [DOWN, DOWN, RIGHT]

所有唯一路径选择都是(它减去给定列表中重复的重复排列):

[下,下,右]

[向下,向右,向下]

[右,下,下]

答案 1 :(得分:0)

您将使用回溯(深度优先搜索)查找所有可能的路线

请参阅此处的程序测试http://ideone.com/GqWLa5

#define VALID(x) ((x) >= 0 && (x) < 3)

int arr[3][3];

// to detect previous visited cells and eliminate infinite recursion
short vis[3][3] = { 0 }; 

int xtar, ytar; // destination cell
int xsrc, ysrc; // source cell

// to move in directions: down, up, right, and left, respectively
const int dirx[] = { 0, 0, 1, -1 };
const int diry[] = { 1, -1, 0, 0 };

// temp buffer to print paths
// max size = size of arr + zero termination char
char tmp_path[3 * 3 + 1];

void rec(int x, int y, int idx) // idx is used to fill tmp_path
{
   int i;
   tmp_path[idx] = arr[y][x] + '0';
   if (x == xtar && y == ytar) // basic case
   {
      tmp_path[idx + 1] = 0; // put zero char
      printf("%s\n", tmp_path); // print path
      return;
   }
   if (vis[y][x]) return; // already visited
   vis[y][x] = 1; // otherwise, mark as visited
   for (i = 0; i < 4; ++i) // for each of the 4 directions
      if (VALID(y + diry[i]) && VALID(x + dirx[i]))
         rec(x + dirx[i], y + diry[i], idx + 1);
   vis[y][x] = 0; // reset visited so that can be visited again
}

main()
{
   // input xtar, ytar, xsrc, ysrc, arr
   rec(xsrc, ysrc, 0);
}