#include <stdio.h>
#define VALID(x) ((x) >= 0 && (x) < 3)
int arr[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
// 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;
if (vis[y][x]) return; // already visited
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;
}
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
xtar = 1;
ytar = 2;
xsrc = 0;
ysrc = 0;
rec(xsrc, ysrc, 0);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFZBTElEKHgpICgoeCkgPj0gMCAmJiAoeCkgPCAzKQoKaW50IGFyclszXVszXSA9IHsgezEsMiwzfSwgezQsNSw2fSwgezcsOCw5fSB9OwoKLy8gdG8gZGV0ZWN0IHByZXZpb3VzIHZpc2l0ZWQgY2VsbHMgYW5kIGVsaW1pbmF0ZSBpbmZpbml0ZSByZWN1cnNpb24Kc2hvcnQgdmlzWzNdWzNdID0geyAwIH07IAoKaW50IHh0YXIsIHl0YXI7IC8vIGRlc3RpbmF0aW9uIGNlbGwKaW50IHhzcmMsIHlzcmM7IC8vIHNvdXJjZSBjZWxsCgovLyB0byBtb3ZlIGluIGRpcmVjdGlvbnM6IGRvd24sIHVwLCByaWdodCwgYW5kIGxlZnQsIHJlc3BlY3RpdmVseQpjb25zdCBpbnQgZGlyeFtdID0geyAwLCAwLCAxLCAtMSB9Owpjb25zdCBpbnQgZGlyeVtdID0geyAxLCAtMSwgMCwgMCB9OwoKLy8gdGVtcCBidWZmZXIgdG8gcHJpbnQgcGF0aHMKLy8gbWF4IHNpemUgPSBzaXplIG9mIGFyciArIHplcm8gdGVybWluYXRpb24gY2hhcgpjaGFyIHRtcF9wYXRoWzMgKiAzICsgMV07Cgp2b2lkIHJlYyhpbnQgeCwgaW50IHksIGludCBpZHgpIC8vIGlkeCBpcyB1c2VkIHRvIGZpbGwgdG1wX3BhdGgKewogICBpbnQgaTsKICAgaWYgKHZpc1t5XVt4XSkgcmV0dXJuOyAvLyBhbHJlYWR5IHZpc2l0ZWQKICAgdG1wX3BhdGhbaWR4XSA9IGFyclt5XVt4XSArICcwJzsKICAgaWYgKHggPT0geHRhciAmJiB5ID09IHl0YXIpIC8vIGJhc2ljIGNhc2UKICAgewogICAgICB0bXBfcGF0aFtpZHggKyAxXSA9IDA7IC8vIHB1dCB6ZXJvIGNoYXIKICAgICAgcHJpbnRmKCIlc1xuIiwgdG1wX3BhdGgpOyAvLyBwcmludCBwYXRoCiAgICAgIHJldHVybjsKICAgfQogICB2aXNbeV1beF0gPSAxOyAvLyBvdGhlcndpc2UsIG1hcmsgYXMgdmlzaXRlZAogICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSAvLyBmb3IgZWFjaCBvZiB0aGUgNCBkaXJlY3Rpb25zCiAgICAgIGlmIChWQUxJRCh5ICsgZGlyeVtpXSkgJiYgVkFMSUQoeCArIGRpcnhbaV0pKQogICAgICAgICByZWMoeCArIGRpcnhbaV0sIHkgKyBkaXJ5W2ldLCBpZHggKyAxKTsKICAgdmlzW3ldW3hdID0gMDsgLy8gcmVzZXQgdmlzaXRlZCBzbyB0aGF0IGNhbiBiZSB2aXNpdGVkIGFnYWluCn0KCm1haW4oKQp7CiAgIC8vIGlucHV0IHh0YXIsIHl0YXIsIHhzcmMsIHlzcmMsIGFycgogICB4dGFyID0gMTsKICAgeXRhciA9IDI7CiAgIHhzcmMgPSAwOwogICB5c3JjID0gMDsKICAgcmVjKHhzcmMsIHlzcmMsIDApOwp9