Professional Documents
Culture Documents
Backtracking
Backtracking
Primer iz knjige:**********************************************
Raspored dama na šahovskoj tabli tako da se ne napadaju
2.***********************************************************
RAD SA SKAKACIMA
Potrebno je posetiti svako polje šahovske table skakačem, po šahovskim pravilima, polazeći od zadatog polja sa
koordinatama (X, Y), pri čemu je na svako polje table dozvoljeno stati tačno jednom. Odrediti sva rešenja.
#include<stdio.h>
#define V 10
#define K 10
static int t[V][K]={0};
int prx[8]={-2,-2,2,2,-1,-1,1,1};
int pry[8]={-1,1,-1,1,-2,2,-2,2};
3.************************************************
LAVIRINT knjiga 180/13
4.***********************
BOJENJE MAPE
Data je geografska karta simetricnom matricom susedstva A(nxn) gde je a[i,j]=1 ako je država i susedna
državi j, a[i,j]=0 inace. Konstruisati algoritam kojom se boji karta sa 4 boje (1, 2, 3, 4) tako da su susedne
države obojene razlicitim bojama. . Naci sva resenja, a ukoliko rešenja nema dati odgovarajucu poruku.
#include <iostream>
#include <stdio.h>
using namespace std;
void pisi(int n)
{ b++;
for (int i=1; i<=n; i++)
cout << "Drzava " << i << " je obojena bojom " << boja[i]<< endl;
cout << "____________________________________" << endl;
}
void Boji(int k)
{
for (int c=1; c<=4; c++) // proba da drzavu K boji nekom od 4 boje
if (!SusedOd(k,c)) // ako susedi od K nisu obojeni bojom c
{boja[k]=c; // oboji drzavu K bojom c
if (k==n)pisi(n); // ako su sve drzave obojene, pisi resenje
else Boji(k+1); // ako nisu, nastavi sa bojenjem
boja[k]=0; // odustaje se od tekuceg izbora boje da bi se probalo sa drugom bojom
}
}
int main()
{cin >> n;
for (int i=2; i<=n; i++)
for (int j=1; j<i; j++)
{cout << "Da li se drzava " << i << " granici sa " << j<< ":";
cin >> a[i][j];
a[j][i]=a[i][j];
}
Boji(1);
if (!b) cout << "Nema resenja";
}
5.************************************************
// Neka je skup odreðen nizom Skup od N elemenata. Potrebno je kreirati sve njegove podskupove.
using namespace std;
int Skup[20],GenerisaniPS[20],n;
// GenerisaniPS je niz u kome se generi[e podskup
void pisiPodskup(int n)
{for(int i=0;i< n;i++)
printf("%3d",GenerisaniPS[i] );
printf("\n");
getchar();}
int main()
{ cin >>n;
for(int i=0;i<n;i++)cin >>Skup[i];
FormirajPS(0,0);
6.************************************************
//Zadatak: Popuniti zadatu sudoku zagonetku. Latinski kvadrati se rešavaju slično, samo lakše
//0 je oznaka da je nepopunjena æelija.
#include <stdio.h>
bool ImaRes=false;
bool moze(int S[9][9], int red, int kol, int broj)
{ int i,j, pi=red/3*3, pj=kol/3*3;
for (i=0;i<9;i++) if (S[i][kol]==broj) return 0;
for (i=0;i<9;i++) if (S[red][i]==broj) return 0;//Moze jedan for za ova dva
for (i=pi;i<pi+3;i++)
for (j=pj;j<pj+3;j++) if (S[i][j]==broj) return 0;
return 1;
}