我有一个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
但是我找不到打印它们的方法。有什么想法吗?
答案 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);
}