#include <stdio.h>
#include <stdlib.h>
static void press(int codeLenSoFar, int x, int y);
#define PAD_WIDTH 3
#define PAD_HEIGHT 3
#define MIN_CODE_LEN 1 /* >= 1 */
#define MAX_CODE_LEN (PAD_WIDTH * PAD_HEIGHT)
typedef struct {
int dx;
int dy;
} direction;
static const direction directions[] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}}
;
static unsigned long nCodes[MAX_CODE_LEN - MIN_CODE_LEN + 1] = {0};
static int pad[PAD_WIDTH][PAD_HEIGHT] = {{0}};
int main(void) {
int len, x, y;
unsigned long sum;
for (y = 0; y < PAD_HEIGHT; ++y) {
for (x = 0; x < PAD_WIDTH; ++x) {
press(0, x, y);
}
}
sum = 0;
for (len = MIN_CODE_LEN; len <= MAX_CODE_LEN; ++len) {
if (printf("%d long: %lu\n", len
, nCodes
[len
- MIN_CODE_LEN
]) < sum += nCodes[len - MIN_CODE_LEN];
}
if (printf("sum: %lu\n", sum
) < 0) exit(EXIT_FAILURE
); return EXIT_SUCCESS;
}
static void press(int codeLenSoFar, int x, int y) {
int i, nextX, nextY;
if (++codeLenSoFar >= MIN_CODE_LEN) {
++nCodes[codeLenSoFar - MIN_CODE_LEN];
}
pad[x][y] = 1;
if (codeLenSoFar < MAX_CODE_LEN) {
for (i = 0; i < (int) (sizeof directions / sizeof *directions);
++i) {
nextX = x + directions[i].dx;
nextY = y + directions[i].dy;
if (nextX >= 0 && nextX < PAD_WIDTH && nextY >= 0 && nextY <
PAD_HEIGHT && !pad[nextX][nextY]) {
press(codeLenSoFar, nextX, nextY);
}
}
}
pad[x][y] = 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4Kc3RhdGljIHZvaWQgcHJlc3MoaW50IGNvZGVMZW5Tb0ZhciwgaW50IHgsIGludCB5KTsKCiNkZWZpbmUgUEFEX1dJRFRIIDMKI2RlZmluZSBQQURfSEVJR0hUIDMKI2RlZmluZSBNSU5fQ09ERV9MRU4gMSAvKiA+PSAxICovCiNkZWZpbmUgTUFYX0NPREVfTEVOIChQQURfV0lEVEggKiBQQURfSEVJR0hUKQoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IGR4OwogICAgaW50IGR5Owp9IGRpcmVjdGlvbjsKCnN0YXRpYyBjb25zdCBkaXJlY3Rpb24gZGlyZWN0aW9uc1tdID0ge3stMSwgMH0sIHswLCAtMX0sIHswLCAxfSwgezEsIDB9fQogIDsKCnN0YXRpYyB1bnNpZ25lZCBsb25nIG5Db2Rlc1tNQVhfQ09ERV9MRU4gLSBNSU5fQ09ERV9MRU4gKyAxXSA9IHswfTsKc3RhdGljIGludCBwYWRbUEFEX1dJRFRIXVtQQURfSEVJR0hUXSA9IHt7MH19OwoKaW50IG1haW4odm9pZCkgewogICAgaW50IGxlbiwgeCwgeTsKICAgIHVuc2lnbmVkIGxvbmcgc3VtOwoKICAgIGZvciAoeSA9IDA7IHkgPCBQQURfSEVJR0hUOyArK3kpIHsKICAgICAgICBmb3IgKHggPSAwOyB4IDwgUEFEX1dJRFRIOyArK3gpIHsKICAgICAgICAgICAgcHJlc3MoMCwgeCwgeSk7CiAgICAgICAgfQogICAgfQogICAgc3VtID0gMDsKICAgIGZvciAobGVuID0gTUlOX0NPREVfTEVOOyBsZW4gPD0gTUFYX0NPREVfTEVOOyArK2xlbikgewogICAgICAgIGlmIChwcmludGYoIiVkIGxvbmc6ICVsdVxuIiwgbGVuLCBuQ29kZXNbbGVuIC0gTUlOX0NPREVfTEVOXSkgPAogICAgICAgICAgMCkgZXhpdChFWElUX0ZBSUxVUkUpOwogICAgICAgIHN1bSArPSBuQ29kZXNbbGVuIC0gTUlOX0NPREVfTEVOXTsKICAgIH0KICAgIGlmIChwcmludGYoInN1bTogJWx1XG4iLCBzdW0pIDwgMCkgZXhpdChFWElUX0ZBSUxVUkUpOwogICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQoKc3RhdGljIHZvaWQgcHJlc3MoaW50IGNvZGVMZW5Tb0ZhciwgaW50IHgsIGludCB5KSB7CiAgICBpbnQgaSwgbmV4dFgsIG5leHRZOwoKICAgIGlmICgrK2NvZGVMZW5Tb0ZhciA+PSBNSU5fQ09ERV9MRU4pIHsKICAgICAgICArK25Db2Rlc1tjb2RlTGVuU29GYXIgLSBNSU5fQ09ERV9MRU5dOwogICAgfQogICAgcGFkW3hdW3ldID0gMTsKICAgIGlmIChjb2RlTGVuU29GYXIgPCBNQVhfQ09ERV9MRU4pIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgKHNpemVvZiBkaXJlY3Rpb25zIC8gc2l6ZW9mICpkaXJlY3Rpb25zKTsKICAgICAgICAgICsraSkgewogICAgICAgICAgICBuZXh0WCA9IHggKyBkaXJlY3Rpb25zW2ldLmR4OwogICAgICAgICAgICBuZXh0WSA9IHkgKyBkaXJlY3Rpb25zW2ldLmR5OwogICAgICAgICAgICBpZiAobmV4dFggPj0gMCAmJiBuZXh0WCA8IFBBRF9XSURUSCAmJiBuZXh0WSA+PSAwICYmIG5leHRZIDwKICAgICAgICAgICAgICBQQURfSEVJR0hUICYmICFwYWRbbmV4dFhdW25leHRZXSkgewogICAgICAgICAgICAgICAgcHJlc3MoY29kZUxlblNvRmFyLCBuZXh0WCwgbmV4dFkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcGFkW3hdW3ldID0gMDsKfQo=