Idea jest taka - Konik szachowy na szachownicy 8x8 pol- stawiasz go na pozycji X ,Y . on zapierdziela po szachownicy i zaznacza pola na
jakich staje .Ma zaznaczyc wszystkie (i najlepiej stanac na poluu od jakiego zaczal) i niestanac dwa razy na tym samym.
Ja to wykombinowalem (z pomoca kolegi) ze to na stosie zrobie .. jak mu sie uda zrobic jakis krok (ma 8 mozliwosci do wyboku - jak to konik)
to wrzyuca swoja pozycje na stos - razem z numerem kroku jaki zrobi(od 1 do 8) oraz z kolejnym skokiem (od 1-34 - bo tyle pol na szachownicy)
jak sie zablokuje - tzn. ilosc skokow bedzie mniejsza niz 64 (63) a on niebedzie mogl juz zrobic zadnego kroku -(proboje robic krok 1 ,2 ... 8)
to laduje ze stosu swoja poprzednia pozycje razem z numerkiem krokmu (1-8) oraz skokiem (od 1 -64) i robi jesszcze numer kroku + 1 . czyli jak tam gdziesz poszedl
krokirm numer 3 .. to wczyta ze stosu i pojdzie (sprobuje isc ) inna droga.jesli znowu sie zablokuje - to poraz kolejny ze stosu bierze dane
i dla nowych danych sie rusza - ale znowu + 1 skok. AAA wazne - jeszcze musi po sobie posprzatac - czyli jak sie cofa -
to musi jedynke na 0 zamnienic (zero) . no bo sie cofa.i tak sobie probuje . az nawet powinien sie wracac do kroku nr 1 (tego 1-64)..
ale,,, moj konik jakis kulawy - niechce chodzic. qrcze.
Napisalem progsa - ale nieche dzialac prawidłowo - chcetnym kod przesle. HELP . ! na Sobote musze to zrobic ! 19.06.2004 :D
0
0
#include <stdlib.h>
#include <stdio.h>
struct ruchy{ruchy* nx;int nr;};
void push(ruchy*& r,int pos){
ruchy* p=new ruchy;
p->nr=pos;
p->nx=r;
r=p;
}
int pop(ruchy*& r){
int i=r->nr;
ruchy* p=r;
r=r->nx;
delete p;
return i;
}
void main(){
struct{int x,y;}r[8]={{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2}};
ruchy* ss=0;
int szach[8][8];
int x=8,y,pos=-1,sp=1;
while(x--){
y=8;
while(y--)szach[x][y]=0;
}
randomize();
x=random(8); // losuje, bo nie chce
y=random(8); // mi sie wczytywac
szach[x][y]=1; // punkt startowy
do{
push(ss,pos);
pos=0;
lab:
while((pos<8)?(x+r[pos].x>7||x+r[pos].x<0||y+r[pos].y>7||y+r[pos].y<0)?1:(szach[x+r[pos].x][y+r[pos].y]):0)pos++;
if(pos!=8){
x+=r[pos].x;
y+=r[pos].y;
szach[x][y]=1;
sp++;
}else{
szach[x][y]=0;
pos=pop(ss);
sp--;
if(pos!=-1){
x-=r[pos].x;
y-=r[pos++].y;
goto lab;
}
}
}while(pos!=-1 && sp<64);
printf((sp==64)?"ok":"nie ok");
}
Konik chodzi, cofa sie jesli nie jest mozliwe wykonanie ruchow, czysci tablice. Ale niestety z braku czasu (max 648=248 mozliwości o ile sie nie mylę, a ja mam tylko celerona 400) nie byłem w stanie dojśc do zakonczenia pętli.
0
Przede wszystkim wcale nie wiadomo czy będzie mógł stanąć na każdym polu. To zadanie to nic innego jak znalezienie drogi hamiltona.
Poczytaj sobie o tym.