八皇后

#include  < graphics.h >
#include 
< stdlib.h >
#include 
< stdio.h >
#include 
< dos.h >
char  n[ 3 ] = {'0','0'} ; /*用于记录第几组解*/
int  a[ 8 ],b[ 15 ],c[ 24 ],i;
int  h[ 8 ] = {127,177,227,277,327,377,427,477} ; /*每个皇后的行坐标*/
int  l[ 8 ] = {252,217,182,147,112,77,42,7} /*每个皇后的列坐标*/
void   * arrow;
void   try ( int  i)
{
    
int j;
    
for (j=1;j<=8;j++)
        
if (a[j-1]+b[i+j-2]+c[i-j+7]==3/*如果第i列第j行为空*/
        
{
            a[j
-1]=0;b[i+j-2]=0;c[i-j+7]=0;/*占用第i列第j行*/
            putimage(h[i
-1],l[j-1],arrow,COPY_PUT);/*显示皇后图形*/
            delay(
500);/*延时*/
            
if(i<8try(i+1);
            
else /*输出一组解*/
            
{
                n[
1]++;if (n[1]>'9'{n[0]++;n[1]='0';}
                bar(
260,300,390,340);/*显示第n组解*/
                outtextxy(
275,300,n);
                delay(
3000);
            }

            a[j
-1]=1;b[i+j-2]=1;c[i-j+7]=1;
            putimage(h[i
-1],l[j-1],arrow,XOR_PUT);/*消去皇后,继续寻找下一组解*/
            delay(
500);
        }

}

int  main( void )
{
    
int gdrive=DETECT,gmode,errorcode;
    unsigned 
int size;
    initgraph(
&gdrive,&gmode,"");
    errorcode
=graphresult();
    
if (errorcode!=grOk)
    
{printf("Graphics error ");exit(1);}
    rectangle(
50,5,100,40);
    rectangle(
60,25,90,33);
    
/* 画皇冠 */
    line(
60,28,90,28);line(60,25,55,15);
    line(
55,15,68,25);line(68,25,68,10);
    line(
68,10,75,25);line(75,25,82,10);
    line(
82,10,82,25);line(82,25,95,15);
    line(
95,15,90,25);
    size
=imagesize(52,7,98,38); arrow=malloc(size);
    getimage(
52,7,98,38,arrow); /* 把皇冠保存到缓冲区 */
    clearviewport();
    settextstyle(TRIPLEX_FONT, HORIZ_DIR, 
4);
    setusercharsize(
3111);
    setfillstyle(
1,4);
    
for (i=0;i<=7;i++) a=1;
    
for (i=0;i<=14;i++) b=1;
    
for (i=0;i<=23;i++) c=1;
    
for (i=0;i<=8;i++) line(125,i*35+5,525,i*35+5); /* 画棋盘 */
    
for (i=0;i<=8;i++) line(125+i*50,5,125+i*50,285);
    
try(1); /* 调用递归函数 */
    delay(
3000);
    closegraph();
    free(arrow);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值