Backtracking Programs
Backtracking Programs
TRAVELLING SALESPERSON
#include<stdio.h>
#include<conio.h>
int TSP(int c[][10],int s[],int n,int p,int in);
main()
{
int c[10][10],s[10],i,j,n,mc,p,in=0;
puts("Enter the number of vertices in the graph( def 4):\t");
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[i]=0;
for(j=0;j<n;j++)
if(i==j)
c[i][j]=0;
else
c[i][j]=50000;
}
c[0][1]=10;c[0][2]=15;c[0][3]=20;c[1][0]=5;c[1][2]=9;c[1][3]=10;
c[2][0]=6;c[2][1]=13;c[2][3]=12;c[3][0]=8;c[3][1]=8;c[3][2]=9;
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
printf("%d\t",c[i][j]);
}
p=in=0;
mc=TSP(c,s,n,p,in);
puts("\n");
printf("The minimum cost of the tour is:\t%d",mc);
getch();
}
int TSP(int c[][10],int s[],int n,int p,int in)
{
int min=50000,a[10],k,count,i;
count=0;
for(i=0;i<n;i++)
a[i]=s[i];
a[p]=-1;
for(i=0;i<n;i++)
if(a[i]!=-1)
{
k=c[p][i]+TSP(c,a,n,i,in);
if(min>k)
min=k;
count++;
}
if(count==0)
{
return c[p][in];
}
else
return min;
}
2. N-Queens Problem
#include<stdio.h>
#include<conio.h>
int nq(int k,int n);
int place(int k,int i);
int abs(int n);
int a[10];
main()
{
int c,n;
puts("Enter the size of chess board:\t");
scanf("%d",&n);
c=nq(1,n);
printf("\nThere are %d solutions.",c);
getch();
}
int nq(int k,int n)
{
int i,c,b,l;
for(i=1;i<=n;i++)
{
if(place(k,i))
{
a[k]=i;
if(k==n)
{
/*for(l=1;l<=n;l++)
printf("%d\t",a[l]);
puts("");*/
for(c=1;c<=n;c++)
{
for(b=1;b<=1+8*n;b++)
printf("-");
printf("\n");
for(b=1;b<=1+n;b++)
printf("|
");
printf("\n");
for(b=1;b<=n;b++)
{
printf("| ");
if(a[c]==b)
printf("O ");
else
printf("
");
}
printf("|\n");
for(b=1;b<=1+n;b++)
printf("|
");
puts("");
}
for(b=0;b<8*n+1;b++)
printf("-");
puts("\n");
a[9]++;
}
else
nq(k+1,n);
}
}
return a[9];
}
int place(int k,int i)
{
int j;
for(j=1;j<=k-1;j++)
if((a[j]==i)||(abs(a[j]-i)==abs(j-k)))
return 0;
return 1;
}
int abs(int n)
{
if (n>=0)
return n;
else
return -1*n;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",g[i][j]);
puts("\n");
}
puts("Enter the max number of colors:\t");
scanf("%d",&m);
c=mc(1,n,g);
if(c==0)
puts("\nNo solution possible.");
getch();
}
int mc(int k,int n,int g[][10])
{
int l;
while (1)
{
nv(k,n,g);
//printf("%d *\n",k);
if (a[k]==0)
if(v==0)
return 0;
else
return 1;
if(k==n)
{
//puts("*\n");
for(l=1;l<=n;l++)
printf("%d\t",a[l]);
puts("");
v++;
return 1;
}
else
mc(k+1,n,g);
}
}
4. Hamiltonian Cycles
#include<stdio.h>
#include<conio.h>
int a[10],g[10][10];
int hamiltonian(int k,int n);
void nv(int k,int n);
main()
{
int i,j,n,c;
for(i=0;i<10;i++)
a[i]=0;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
g[i][j]=0;
g[1][2]=g[1][3]=g[1][7]=g[2][3]=g[2][8]=g[3][4]=g[3][6]=g[4][5]=g[5][6]=g[6][7]=g[7][8]=
1;
for(i=1;i<9;i++)
for(j=1;j<i;j++)
g[i][j]=g[j][i];
for(i=1;i<9;i++)
{
printf("\n");
for(j=1;j<9;j++)
printf("%d\t",g[i][j]);
}
puts("\n\n");
n=8;
c=hamiltonian(1,n);
if(c==0)
printf("\nNo cycle possible.");
getch();
}
int hamiltonian(int k,int n)
{
int i,c=0;
while(1)
{
nv(k,n);
if(a[k]==0)
return 0;
if(k==n)
{
for(i=1;i<=n;i++)
printf("%d\t",a[i]);
puts("");
c++;
}
else
hamiltonian(k+1,n);
}
}
void nv(int k,int n)
{
int j;
while(1)
{
a[k]=(a[k]+1)%(n+1);
if(a[k]==0)
return;
if((g[a[k-1]][a[k]]!=0)||(k==1))
{
for(j=1;j<=k-1;j++)
if(a[k]==a[j])
break;
if(j==k)
if((k<n)||((k==n)&&g[a[n]][a[1]]!=0))
return;
}
}
}
y[k]=1;
if(k<n)
bknap(k+1,cp+p[k],cw+w[k]);
if((cp+p[k]>fp)&&(k==n))
{
fp=cp+p[k];
fw=cw+w[k];
for(j=1;j<=k;j++)
x[j]=y[j];
}
}
if(bound(cp,cw,k)>=fp)
{
y[k]=0;
if(k<n)
bknap(k+1,cp,cw);
if((cp>=fp)&&(k==n))
{
fp=cp;
fw=cw;
for(j=1;j<=k;j++)
x[j]=y[j];
}
}
}
int bound(int cp,int cw,int k)
{
int b=cp,c=cw,i;
for(i=k+1;i<=n;i++)
{
c=c+w[i];
if(c<m)
b=b+p[i];
else
return b+(1-(c-m)/w[i])*p[i];
}
return b;
}