N Queen problem is a classic constraint satisfaction problem based on chess game.
The idea is how to put N numbers of Queen in N x N chessboard without giving them any chance to kill each other in one turn.

This post is a continuation from my previous post (click here).
Here is another version of algorithm, written by my friend, Daniel Handoko. This post is published by his approval.
<pre>// N Queen Problem : versi 6 by Daniel Handoko
// Results are displayed with graphic
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#include<dos.h>
#include<graphics.h>
#include<stdlib.h>
int jml,x,y,level,level1,queen[51],posx,posy;
char row[51];
long double waktu[51],waktuasli[51];
unsigned long solusi,backtrack;
struct time t1,t2;
FILE *pf;
void initialize(void)
{for(x=1;x<=jml;x++){queen[x]=0;row[x]=0;}
level=0;solusi=0;backtrack=0;
};
void graph(void)
{int a = DETECT,b,y;
initgraph(&a,&b,"");
y=getmaxy()-(getmaxy()*1/4);
setcolor(4);moveto(1,y);
for(a=1;a<=jml;a++)
{lineto(a*10,y-waktuasli[a]);}
getch();
closegraph();
}
void saving(void)
{int i;
if((pf=fopen("data.txt","w"))==NULL)
{printf("KESALAHAN : file tidak dapat dibuka !!!\7n");
exit(1);
}
};
void mark(void)
{int phi;
for(x=1;x<=jml;x++){row[x]=0;}
for(y=1;y<level;y++)
{row[queen[y]]=1;phi=level-y;
if(queen[y]-phi>=0){row[queen[y]-phi]=1;}
if(queen[y]+phi<=jml){row[queen[y]+phi]=1;}
}
};
void marking(void)
{int phi;
for(x=1;x<=jml;x++){row[x]=0;}
for(y=1;y<level1;y++)
{row[queen[y]]=1;phi=level1-y;
if(queen[y]-phi>=0){row[queen[y]-phi]=1;}
if(queen[y]+phi<=jml){row[queen[y]+phi]=1;}
}
};
void back(void)
{char find;
do
{for(x=1;x<=jml;x++){row[x]=0;}
find=0;level--;mark();
row[queen[level]]=1;
for(x=queen[level];x<jml;x++)
{if(row[x]==0)
{queen[level]=x;
find=1;break;
}
}
}while(find==0);
};
void control(void)
{int i=0;
char find=0;
do{level++;find=0;
mark();
for(i=1;i<=jml;i++)
{if(row[i]==0)
{queen[level]=i;
find=1;
if(level==jml)solusi++;
break;
}
}
if(find==0){backtrack++;back();}
}while(solusi==0);
};
void TimeCount(char pil)
{struct time t;
float count;
if(pil==3)
{count=((t2.ti_hour*3600)+(t2.ti_min*60)+(t2.ti_sec)+(t2.ti_hund*0.01))-
((t1.ti_hour*3600)+(t1.ti_min*60)+(t1.ti_sec)+(t1.ti_hund*0.01));
waktu[jml]=count;
}
else gettime(&t);
if(pil==1) t1=t;
if(pil==2) t2=t;
}
void main(void)
{int i,b;
long double get=0;
saving();
do{clrscr();
printf("jumlah queen [4..50] : ");scanf("%d",&jml);
}while(jml<4 || jml>50);
b=jml;jml=3;
do{
jml++;
backtrack=0;solusi=0;
printf("Processing...");
TimeCount(1);control();TimeCount(2);TimeCount(3);
for(i=1;i<=jml;i++){get=get+waktu[i];waktuasli[jml]=get;}
gotoxy(1,wherey());clreol;
printf("%d Queen = %3.2Lf detik, %lu Backtrack\n",jml,get,backtrack);
fprintf(pf,"%d Queen = %3.2Lf detik, %lu Backtrack\n",jml,get,backtrack);
get=0;
}while(b>jml);
getch();graph();
};
</pre>
Leave A Comment