📄 queen.cpp
字号:
/* queen.c V6.15 */
/* author:zhouzhenhua */
/*hunan agricultural university*/
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "graphics.h"
#include "string.h"
#define DataType int
#define N 8
#define CELLWID 50
struct dblNode;
typedef struct dblNode *pdblNode;
typedef struct dblNode *pdblHead;
struct dblNode
{
DataType s[N];
pdblNode llink,rlink;
};
pdblHead createNullList_link(void)
{
pdblHead cdlist;
int i;
cdlist=(pdblHead)malloc(sizeof(struct dblNode));
if(cdlist==NULL)
{
printf("out of space is fun pdblHead createNullList_link(void)!");
exit(1);
}
for(i=0;i<N;i++)
{
cdlist->s[i]=0;
}
cdlist->llink=cdlist->rlink=NULL;
return(cdlist);
}/*pdblHead createNullList_link(void)*/
void append_link(pdblHead cdlist,DataType arr[])
{
pdblNode q;
int i;
q=(pdblNode)malloc(sizeof(struct dblNode));
if(q==NULL)
{
printf("out of space in fun void append_link(pdblHead cdlist,DataType arr[])");
exit(1);
}
for(i=0;i<N;i++)
q->s[i]=arr[i];
cdlist->s[0]++;
if(cdlist->rlink!=NULL)
{
q->llink=cdlist->llink;
q->rlink=cdlist->rlink;
cdlist->llink->rlink=q;
cdlist->llink=q;
}else{
q->llink=NULL;
q->rlink=NULL;
cdlist->rlink=q;
cdlist->llink=q;
}
}/*void append_link(pdblHead cdlist,DataType arr[])*/
void print_link(pdblHead cdlist)
{
pdblNode p=cdlist->rlink;
int i=1,j;
if(p==NULL)
{
printf("empty cdlist in fun viod print_link(pdblHeah cdlist)!");
exit(1);
}
for(i=1;i<=cdlist->s[0];i++)
{
printf("the res [%d]:",i);
for(j=0;j<N;j++)
{
printf("%4d",p->s[j]);
}
printf("\n");
p=p->rlink;
}
}/*viod print_link(pdblHeah cdlist)*/
void init(void)
{
int driver=VGA,mode=VGAHI,errorcode;
initgraph(&driver,&mode,"");
errorcode=graphresult();
if(errorcode!=grOk)
{
printf("Graphics error:%s\n",grapherrormsg(errorcode));
printf("Press any key to halt:\n");
getch();
exit(1);
}
}
void draw_chessboard()
{
int x0,y0,x,y;
int i;
x0=(640-CELLWID*N)/2;
y0=CELLWID/3;
clearviewport();
for(i=0,x=x0+N*CELLWID;i<=N;i++)
{
y=y0+i*CELLWID;
line(x0,y,x,y);
}
for(i=0,y=y0+N*CELLWID;i<=N;i++)
{
x=x0+i*CELLWID;
line(x,y0,x,y);
}
}
void draw_circle(int x,int y)
{
int i;
for(i=CELLWID/2;i>0;i--)
circle(x,y,i);
}
void draw_queen(int arr[])
{
int x0,y0,x,y;
int i;
x0=(640-CELLWID*N)/2;
y0=CELLWID/3;
for(i=0;i<N;i++)
{
x=x0+i*CELLWID+CELLWID/2;
y=y0+arr[i]*CELLWID+CELLWID/2;
draw_circle(x,y);
}
}
char* atos(int num)
{
char s[81];
int i;
if(num<=0)
{
printf("data error in fun char* atos(int num)!\n");
printf("Press any key to halt!\n");
getch();
exit(1);
}
int divisor=1,quotient,remainder;
while(divisor<=num)
divisor*=10;
divisor/=10;
for(i=0;divisor!=0;divisor/=10,i++)
{
quotient=num/divisor;
num=num%divisor;
s[i]=(char)(quotient+48);
}
s[i]='\0';
return(s);
}
void draw_info(int total,int num)
{
char author[]={"Author:Zhou Zhenhua"};
char date[]={"Date:June 14th 2004"};
char esc[]={"Esc: -1"};
char sum[81]={"Total: "};
char now[81]={"Now: "};
char input[81]={"Input: "};
char* pchar;
int x0=(640-CELLWID*N)/2,y0=CELLWID/3;
int x,y,i;
strcat(sum,atos(total));
strcat(now,atos(num));
x=x0+CELLWID/2;
y=y0+CELLWID*N+20;
outtextxy(x,y,author);
x=x0+4*CELLWID;
outtextxy(x,y,date);
x=x0+CELLWID*N+20;
y=y0+CELLWID*(N-1)-40;
outtextxy(x,y,sum);
y+=20;
outtextxy(x,y,esc);
y=y+20;
outtextxy(x,y,now);
y+=20;
outtextxy(x,y,input);
gotoxy(76,25);
}
int test(DataType* arr,int index,DataType x)
{
int i;
for(i=0;i<index;i++)
if((x==arr[i])||(x-index==arr[i]-i)||(x+index==arr[i]+i))
return(0);
return(1);
}
int queen(DataType* arr,int len)
{
int i=len-1,j=arr[i]+1;
if(arr[0]==-1) i=j=0;
for(;i<len;)
{
for(;j<len;j++)
if(test(arr,i,j))
{
arr[i]=j; break;/*break,j mei you zhi jia!*/
}
if(j==len)
{
i--; j=arr[i]+1;
if(i==-1) return(0);
}else{
i++;j=0;
}
}/*for(i=0;i<len;)*/
return(1);
}/*void queen(DataType* arr,int len)*/
void queenAll(pdblHead head)
{
DataType array[N]={-1};
while(queen(array,N))
{
append_link(head,array);
}
}/*void queenAll(pdblHead head)*/
void print(DataType* arr,int len)
{
int i;
for(i=0;i<len;i++)
printf("%4d",arr[i]);
printf("\n");
}
void main()
{
pdblHead head;
pdblNode p;
char s[10];
int number=1,i;
init();
p=head=createNullList_link();
queenAll(head);
p=p->rlink;
draw_chessboard();
draw_queen(p->s);
draw_info(head->s[0],1);
while(1)
{
gets(s);
gotoxy(100,100);
i=atoi(s);
if(i==-1)
{
closegraph();
exit(1);
}
if(i>0&&i<=head->s[0])
{
number=i;
for(p=head;i>0;i--)
p=p->rlink;
}
draw_chessboard();
draw_queen(p->s);
draw_info(head->s[0],number);
}/*while*/
}/*main()*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -