求 N 皇后问题回溯算法


代码片段(1)
[全屏查看所有代码]

1. [代码]求 N 皇后问题回溯算法     跳至 [1] [全屏预览]

01 /*
02 * File: queen.c
03 * Description: 求 N 皇后问题回溯算法
04 * Created: 2001/11/12
05 * Author: Justin Hou [mailto:justin_hou@hotmail.com]
06 */
07 #include <stdio.h>
08  
09 #define  DelayTime  20000                /* 显示棋局时间      */
10 #define  TopX      10                    /* 棋盘左上角 x 坐标  */
11 #define  TopY      5                    /* 棋盘左上角 y 坐标  */
12  
13 int N;                                    /* 皇后数量          */
14  
15 int a[8], b[15], c[15];
16 /*
17 * a[col-1] 记录第 col 列有无皇后, 1 表示有。
18 * b[row+col-2] 记录从左上数第 row+col-1 条斜率为 1 的线上有无皇后。
19 * c[row-col+7] 记录从右上数第 row-col+8 条斜率为 -1 的线上有无皇后。
20 */
21 int Num = 0;
22 int row; 
23 void BackTrack (int row)
24 {
25     int col;                                        /* 局部变量 */
26     for (col=1; col<=N; col++)
27     {
28         if (a[col-1] + b[row+col-2] + c[row-col+N-1] == 0)
29         {
30             a[col-1] = 1;                          /* 更改数据 */
31             b[row+col-2] = 1;
32             c[row-col+N-1] = 1;
33  
34             gotoxy(col*2 + TopX, row + TopY);      /* 画皇后  */
35             putch('Q');
36  
37             if (row < N)
38             {
39                 BackTrack (row + 1);
40             }
41             else
42             {
43                 Num++;                              /* 递归终点 */
44                 gotoxy(40, 9);
45                 printf("Num: %d ", Num);
46                 delay(DelayTime);
47             }
48  
49             a[col-1] = 0;                          /* 清空数据 */
50             b[row+col-2] = 0;
51             c[row-col+N-1] = 0;
52  
53             gotoxy(col*2 + TopX, row + TopY);      /* 清除图象 */
54 putch('.');
55  
56         }/* end if */
57     }/* end for */
58 }/* end function BackTrack */
59  
60 void main()
61 {
62     int i, j;
63     clrscr();
64  
65     gotoxy(1, 10);                            /* 要求用户输入皇后数量 */
66     printf("Input the number of queen: ");
67     while(N <= 0 || N > 14)
68     {
69         scanf("%d", &N);
70         if(N > 14) printf("Two huge number, input again:");
71         if(N <= 0) printf("Can's smaller than 1, again:");
72 }
73  
74 clrscr();
75  
76     for(i=1; i<=N; i++)                        /*  画棋盘(Chessboard) */
77     {
78         for(j=1; j<=N; j++)
79         {
80             gotoxy(i*2 + TopX, j + TopY);
81             putch('.');
82         }
83     }
84  
85     BackTrack(1);                                    /* 开始回溯算法 */
86  
87     gotoxy(12, 17);                                  /* 显示最后结果 */
88     printf ("There are %d kinds of solution.\n", Num);
89  
90     getch();
91 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值