Public feed
#377283
#include <stdio.h>
#include <ctype.h>
#define EXIT_SUCCESS 0
#define SIDE 8
#define FIELDS SIDE*SIDE
typedef enum { false,true } bool;
typedef struct field {
struct field *from,*to;
size_t x,y;
} field;
bool try_move(field *cur, field board[SIDE][SIDE], int x, int y) {
printf("zkousim pohyb %d + %d, %d + %d\n",cur->x,x,cur->y,y);
if (cur->x+x < SIDE && cur->x+x >= 0 && // je to v ramci sachovnice?
cur->y+y < SIDE && cur->y+y >= 0 &&
board[cur->x+x][cur->y+y].to == NULL ) {
size_t to_x = cur->x+x;
size_t to_y = cur->y+y;
cur->to = &(board[to_x][to_y]); // Nenastavi dobre
//board[cur->x+x][cur->y+y]->from = (board[cur->x][cur->y]); // zdanlive nastavi dobre lokalne
board[to_x][to_y].from = cur;
// zde
cur = &(board[to_x][to_y]); // nastavi dobre
//cur->from = &(board[cur->x-x][cur->y-y]);
//printf("Reeturning! new: %d,%d\n",cur->from->x,cur->from->y);
return(true);
} else {
return(false);
}
}
int get_pos(int cur_x,int cur_y,int to_x,int to_y) {
// 0-3
printf("%d %d %d %d\n",cur_x,cur_y,to_x,to_y);
if(cur_x+1==to_x && cur_y+2==to_y) return 0;
if(cur_x+2==to_x && cur_y+1==to_y) return 1;
if(cur_x+2==to_x && cur_y-1==to_y) return 2;
if(cur_x+1==to_x && cur_y-2==to_y) return 3;
// 4-6
if(cur_x-1==to_x && cur_y-2==to_y) return 4;
if(cur_x-2==to_x && cur_y-1==to_y) return 5;
if(cur_x-2==to_x && cur_y+1==to_y) return 6;
return 7;
}
void run_backtrack(size_t col,size_t row) {
// soucasny skok
size_t x,y,counter = 0;
int p;
// definovani sachovnice
field board[SIDE][SIDE];
// nastavim souradnice
for (x=0;x<SIDE;x++) for (y=0;y<SIDE;y++) {
board[x][y].x=x;
board[x][y].y=y;
}
// startovni posice
field *cur = &(board[col][row]); // nastavim cur
// dosahne-li poctu poli, ukonci cyklus...
while (counter < FIELDS) {
printf("%d\n",counter);
// posledni navstiveny ci nenavstiveny
//printf("Zacatek pohybu\n"); // pointer neni detekovan jako NULL
if (cur->to != NULL) {
p = get_pos(cur->x, cur->y, cur->to->x, cur->to->y);
} else {
p = -1;
}
if (p ==-1) { if(try_move(cur,board, 1, 2)) { counter++; continue; } p++; }
if (p == 0) { if(try_move(cur,board, 2, 1)) { counter++; continue; } p++; }
if (p == 1) { if(try_move(cur,board, 2,-1)) { counter++; continue; } p++; }
if (p == 2) { if(try_move(cur,board, 1,-2)) { counter++; continue; } p++; }
if (p == 3) { if(try_move(cur,board,-1,-2)) { counter++; /*printf("%d -> %d,%d -> %d\n",cur->from->x,cur->x,cur->from->y,cur->y);*/ continue; } else { p++; } }
if (p == 4) { if(try_move(cur,board,-2,-1)) { counter++; continue; } p++; }
if (p == 5) { if(try_move(cur,board,-2, 1)) { counter++; continue; } p++; }
if (p == 6) { if(try_move(cur,board,-1, 2)) { counter++; continue; } }
cur->to = NULL;
size_t from_x = cur->from->x; // SIGSEGV
size_t from_y = cur->from->y;
cur = &(board[from_x][from_y]); //cur neni nastaven spravne
counter--;
}
// ... a vyplivne vysledek
};
int main(int argc,char **argv) {
// projdu argumenty programu
size_t i;
for (i=1;i<argc;i++) {
int col = ((islower(argv[i][0]))?toupper(argv[i][0]):argv[i][0])-64;
int row = (argv[i][1])-48;
// zjistim zda byl argument v poradku
if (0 < col && col <= SIDE && 0 < row && row <= SIDE) {
// inicializuju cyklus pro kazdej validni argument
printf("startovní posice je '%c%d', procházim šachovnici...\n",col+64,row);
run_backtrack(col-1,row-1);
} else {
// vratim chybu pokud byl argument nesmyslny
printf("argument '%s' není platný, zadejte platnou stratovní posici například 'B4'\n",argv[i]);
}
}
return(EXIT_SUCCESS);
}