/* 15 puzzle */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
typedef enum _Boolean { False = 0, True = -1 } Boolean;
Boolean confirm(char const *msg) {
char str[256];
for (;;) {
if (msg != NULL) {
}
if (str[0] == 'y') {
return True;
} else if (str[0] == 'n') {
return False;
}
}
}
void initPuzzle(int puzzle[4][4]) {
int i, j, n = 1;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
puzzle[i][j] = n & 0xF;
n++;
}
}
}
Boolean checkPuzzle(int const puzzle[4][4]) {
int i, j, n = 1;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (puzzle[i][j] != (n & 0xF)) {
return False;
}
n++;
}
}
return True;
}
int movePanels(int puzzle[4][4], int const number) {
int xs = -1, ys = -1, xn = -2, yn = -2;
int i, j, m;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (puzzle[i][j] == number) {
xn = j;
yn = i;
} else if (puzzle[i][j] == 0) {
xs = j;
ys = i;
}
}
}
if (xs != xn && ys != yn) {
return 0;
}
if (xs > xn) {
for (j = xs; j > xn; j--) {
puzzle[ys][j] = puzzle[ys][j - 1];
}
m = xs - xn;
} else if (xs < xn) {
for (j = xs; j < xn; j++) {
puzzle[ys][j] = puzzle[ys][j + 1];
}
m = xn - xs;
} else if (ys > yn) {
for (i = ys; i > yn; i--) {
puzzle[i][xs] = puzzle[i - 1][xs];
}
m = ys - yn;
} else /* if (ys < yn) */ {
for (i = ys; i < yn; i++) {
puzzle[i][xs] = puzzle[i + 1][xs];
}
m = yn - ys;
}
puzzle[yn][xn] = 0;
return m;
}
void shuffle(int puzzle[4][4], int const times) {
int i, j, t;
int xs, ys;
int p, k = 0;
for (t = 0; t < times; t++) {
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (puzzle[i][j] == 0) {
xs = j;
ys = i;
goto loopescape;
}
}
}
loopescape:
if (k == 0) {
for (i = 0; i < 4; i++) {
if (puzzle[i][xs] == 0) {
continue;
}
if (p == 0) {
movePanels(puzzle, puzzle[i][xs]);
break;
} else {
p--;
}
}
} else {
for (j = 0; j < 4; j++) {
if (puzzle[ys][j] == 0) {
continue;
}
if (p == 0) {
movePanels(puzzle, puzzle[ys][j]);
break;
} else {
p--;
}
}
}
k = !k;
}
}
void printPuzzle(int const puzzle[4][4]) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (j > 0) {
}
if (puzzle[i][j] > 0) {
} else {
}
}
}
}
Boolean game(void) {
Boolean complete = False;
int n, p, t, m;
int puzzle[4][4];
char str[256];
initPuzzle(puzzle);
shuffle(puzzle, 1000);
t = 0;
for (;;) {
loophead:
printf("---------------------- %d moves\n", t
); printPuzzle(puzzle);
printf("move number [1-15]? ");
for (p
= 0; isprint(str
[p
]); p
++) { if (confirm("do you give up") == True) {
goto gameend;
} else {
goto loophead;
}
}
}
continue;
}
m = movePanels(puzzle, n);
if (m == 0) {
if (n > 0 && n < 16) {
} else {
}
continue;
} else {
t += m;
}
if (checkPuzzle(puzzle) == True) {
printf("complete (total %d moves)", t
); complete = True;
goto gameend;
}
}
gameend:
return complete;
}
int main(void) {
do {
if (game() == False) {
break;
}
} while (confirm("do you continue") == True);
return 0;
}
LyogMTUgcHV6emxlICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDx0aW1lLmg+Cgp0eXBlZGVmIGVudW0gX0Jvb2xlYW4geyBGYWxzZSA9IDAsIFRydWUgPSAtMSB9IEJvb2xlYW47CgpCb29sZWFuIGNvbmZpcm0oY2hhciBjb25zdCAqbXNnKSB7CgljaGFyIHN0clsyNTZdOwoJZm9yICg7OykgewoJCWlmIChtc2cgIT0gTlVMTCkgewoJCQlwcmludGYobXNnKTsKCQl9CgkJcHJpbnRmKCIgW3kvbl0/ICIpOwoJCWZnZXRzKHN0ciwgMjU2LCBzdGRpbik7CgkJc3RyWzBdID0gdG9sb3dlcihzdHJbMF0pOwoJCWlmIChzdHJbMF0gPT0gJ3knKSB7CgkJCXJldHVybiBUcnVlOwoJCX0gZWxzZSBpZiAoc3RyWzBdID09ICduJykgewoJCQlyZXR1cm4gRmFsc2U7CgkJfQoJfQp9Cgp2b2lkIGluaXRQdXp6bGUoaW50IHB1enpsZVs0XVs0XSkgewoJaW50IGksIGosIG4gPSAxOwoJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKCQkJcHV6emxlW2ldW2pdID0gbiAmIDB4RjsKCQkJbisrOwoJCX0KCX0KfQoKQm9vbGVhbiBjaGVja1B1enpsZShpbnQgY29uc3QgcHV6emxlWzRdWzRdKSB7CglpbnQgaSwgaiwgbiA9IDE7Cglmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewoJCQlpZiAocHV6emxlW2ldW2pdICE9IChuICYgMHhGKSkgewoJCQkJcmV0dXJuIEZhbHNlOwoJCQl9CgkJCW4rKzsKCQl9Cgl9CglyZXR1cm4gVHJ1ZTsKfQoKaW50IG1vdmVQYW5lbHMoaW50IHB1enpsZVs0XVs0XSwgaW50IGNvbnN0IG51bWJlcikgewoJaW50IHhzID0gLTEsIHlzID0gLTEsIHhuID0gLTIsIHluID0gLTI7CglpbnQgaSwgaiwgbTsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CgkJCWlmIChwdXp6bGVbaV1bal0gPT0gbnVtYmVyKSB7CgkJCQl4biA9IGo7CgkJCQl5biA9IGk7CgkJCX0gZWxzZSBpZiAocHV6emxlW2ldW2pdID09IDApIHsKCQkJCXhzID0gajsKCQkJCXlzID0gaTsKCQkJfQoJCX0KCX0KCWlmICh4cyAhPSB4biAmJiB5cyAhPSB5bikgewoJCXJldHVybiAwOwoJfQoJaWYgKHhzID4geG4pIHsKCQlmb3IgKGogPSB4czsgaiA+IHhuOyBqLS0pIHsKCQkJcHV6emxlW3lzXVtqXSA9IHB1enpsZVt5c11baiAtIDFdOwoJCX0KCQltID0geHMgLSB4bjsKCX0gZWxzZSBpZiAoeHMgPCB4bikgewoJCWZvciAoaiA9IHhzOyBqIDwgeG47IGorKykgewoJCQlwdXp6bGVbeXNdW2pdID0gcHV6emxlW3lzXVtqICsgMV07CgkJfQoJCW0gPSB4biAtIHhzOwoJfSBlbHNlIGlmICh5cyA+IHluKSB7CgkJZm9yIChpID0geXM7IGkgPiB5bjsgaS0tKSB7CgkJCXB1enpsZVtpXVt4c10gPSBwdXp6bGVbaSAtIDFdW3hzXTsKCQl9CgkJbSA9IHlzIC0geW47Cgl9IGVsc2UgLyogaWYgKHlzIDwgeW4pICovIHsKCQlmb3IgKGkgPSB5czsgaSA8IHluOyBpKyspIHsKCQkJcHV6emxlW2ldW3hzXSA9IHB1enpsZVtpICsgMV1beHNdOwoJCX0KCQltID0geW4gLSB5czsKCX0KCXB1enpsZVt5bl1beG5dID0gMDsKCXJldHVybiBtOwp9Cgp2b2lkIHNodWZmbGUoaW50IHB1enpsZVs0XVs0XSwgaW50IGNvbnN0IHRpbWVzKSB7CglpbnQgaSwgaiwgdDsKCWludCB4cywgeXM7CglpbnQgcCwgayA9IDA7CgkKCWZvciAodCA9IDA7IHQgPCB0aW1lczsgdCsrKSB7CgkJCgkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CgkJCQlpZiAocHV6emxlW2ldW2pdID09IDApIHsKCQkJCQl4cyA9IGo7CgkJCQkJeXMgPSBpOwoJCQkJCWdvdG8gbG9vcGVzY2FwZTsKCQkJCX0KCQkJfQoJCX0KCQlsb29wZXNjYXBlOgoJCQoJCXAgPSByYW5kKCkgJSAzOwoJCQoJCWlmIChrID09IDApIHsKCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJCQkJaWYgKHB1enpsZVtpXVt4c10gPT0gMCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYgKHAgPT0gMCkgewoJCQkJCW1vdmVQYW5lbHMocHV6emxlLCBwdXp6bGVbaV1beHNdKTsKCQkJCQlicmVhazsKCQkJCX0gZWxzZSB7CgkJCQkJcC0tOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewoJCQkJaWYgKHB1enpsZVt5c11bal0gPT0gMCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYgKHAgPT0gMCkgewoJCQkJCW1vdmVQYW5lbHMocHV6emxlLCBwdXp6bGVbeXNdW2pdKTsKCQkJCQlicmVhazsKCQkJCX0gZWxzZSB7CgkJCQkJcC0tOwoJCQkJfQoJCQl9CgkJfQoJCWsgPSAhazsKCX0KfQoKdm9pZCBwcmludFB1enpsZShpbnQgY29uc3QgcHV6emxlWzRdWzRdKSB7CglpbnQgaSwgajsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CgkJCWlmIChqID4gMCkgewoJCQkJcHV0Y2hhcignICcpOwoJCQl9CgkJCWlmIChwdXp6bGVbaV1bal0gPiAwKSB7CgkJCQlwcmludGYoIiUyZCIsIHB1enpsZVtpXVtqXSk7CgkJCX0gZWxzZSB7CgkJCQlwdXRjaGFyKCcgJyk7CgkJCQlwdXRjaGFyKCcqJyk7CgkJCX0KCQl9CgkJcHV0Y2hhcignXG4nKTsKCX0KfQoKQm9vbGVhbiBnYW1lKHZvaWQpIHsKCUJvb2xlYW4gY29tcGxldGUgPSBGYWxzZTsKCWludCBuLCBwLCB0LCBtOwoJaW50IHB1enpsZVs0XVs0XTsKCWNoYXIgc3RyWzI1Nl07CgkKCWluaXRQdXp6bGUocHV6emxlKTsKCQoJc2h1ZmZsZShwdXp6bGUsIDEwMDApOwoJCgl0ID0gMDsKCQoJZm9yICg7OykgewoJCQoJCWxvb3BoZWFkOgoJCQoJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAlZCBtb3Zlc1xuIiwgdCk7CgkJcHJpbnRQdXp6bGUocHV6emxlKTsKCQlwcmludGYoIm1vdmUgbnVtYmVyIFsxLTE1XT8gIik7CgkJZmdldHMoc3RyLCAyNTYsIHN0ZGluKTsKCQkKCQlmb3IgKHAgPSAwOyBpc3ByaW50KHN0cltwXSk7IHArKykgewoJCQlpZiAoIWlzZGlnaXQoc3RyW3BdKSkgewoJCQkJaWYgKGNvbmZpcm0oImRvIHlvdSBnaXZlIHVwIikgPT0gVHJ1ZSkgewoJCQkJCXB1dHMoImdhdmUgdXAiKTsKCQkJCQlnb3RvIGdhbWVlbmQ7CgkJCQl9IGVsc2UgewoJCQkJCWdvdG8gbG9vcGhlYWQ7CgkJCQl9CgkJCX0KCQl9CgkJCgkJaWYgKHN0cmxlbihzdHIpID4gMykgewoJCQlwdXRzKCJpbGxlZ2FsIG51bWJlciIpOwoJCQljb250aW51ZTsKCQl9CgkJCgkJbiA9IGF0b2koc3RyKTsKCQkKCQltID0gbW92ZVBhbmVscyhwdXp6bGUsIG4pOwoJCQoJCWlmIChtID09IDApIHsKCQkJaWYgKG4gPiAwICYmIG4gPCAxNikgewoJCQkJcHV0cygiY2Fubm90IG1vdmUiKTsKCQkJfSBlbHNlIHsKCQkJCXB1dHMoImlsbGVnYWwgbnVtYmVyIik7CgkJCX0KCQkJY29udGludWU7CgkJfSBlbHNlIHsKCQkJdCArPSBtOwoJCX0KCQkKCQlpZiAoY2hlY2tQdXp6bGUocHV6emxlKSA9PSBUcnVlKSB7CgkJCXByaW50ZigiY29tcGxldGUgKHRvdGFsICVkIG1vdmVzKSIsIHQpOwoJCQljb21wbGV0ZSA9IFRydWU7CgkJCWdvdG8gZ2FtZWVuZDsKCQl9Cgl9CglnYW1lZW5kOgoJCglyZXR1cm4gY29tcGxldGU7Cn0KCmludCBtYWluKHZvaWQpIHsKCQoJc3JhbmQoKHVuc2lnbmVkKXRpbWUoTlVMTCkpOwoJCglwdXRzKCIqIDE1IHB1enpsZSAqIik7CgkKCWRvIHsKCQlpZiAoZ2FtZSgpID09IEZhbHNlKSB7CgkJCWJyZWFrOwoJCX0KCX0gd2hpbGUgKGNvbmZpcm0oImRvIHlvdSBjb250aW51ZSIpID09IFRydWUpOwoJCglyZXR1cm4gMDsKfQo=