#include #include #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;xto != 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