c++ - konik szachowy skaczacy po szachownicy.

0

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
#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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1