Public feed #377283

Unnamed

public text v1 · immutable
Raw Edit
·published 2007-03-01 16:58 UTC
rendered paste body

#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 &#353;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&#345;íklad 'B4'\n",argv[i]);
		}
	}
	return(EXIT_SUCCESS);
}