UVa 750 - 8 Queens Chess Problem

本文介绍了一个经典的回溯算法问题——八皇后问题的求解方法。通过预设一个皇后的位置,利用递归搜索来找到所有可能的解决方案,并特别强调了输出格式的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  题目大意:八皇后问题,在一个8*8的棋盘上,放置8个皇后,使得任意两个皇后不在同一行上、不在同一列上、不在同一条对角线上,不过这道题预先给定了一个位置放置一个皇后,让你输出所有可能的答案。

  经典的回溯问题,具体可参考《算法竞赛入门经典》7.4.1,不过这道题对输出的要求说的挺模糊的,要特别注意输出的格式。开始不知道,就WA了一次...

 1 #include <cstdio>
 2 #include <cstring>
 3 #define N 8
 4 
 5 bool vis[3][2*N];
 6 int r, c, kase;
 7 int ans[N];
 8 
 9 void search(int cur)
10 {
11     if (cur == N)
12     {
13         printf("%2d      ", ++kase);
14         for (int i = 0; i < N; i++)
15             printf("%d%s", ans[i]+1, (i==N-1) ? "\n" : " ");
16         return;
17     }
18     if (cur == c)  search(cur+1);
19     else
20     {
21         for (int i = 0; i < N; i++)
22             if (!vis[0][i] && !vis[1][cur-i+N] && !vis[2][cur+i])
23             {
24                 ans[cur] = i;
25                 vis[0][i] = vis[1][cur-i+N] = vis[2][cur+i] = 1;
26                 search(cur+1);
27                 vis[0][i] = vis[1][cur-i+N] = vis[2][cur+i] = 0;
28             }
29     }
30 }
31 
32 int main()
33 {
34 #ifdef LOCAL
35     freopen("in", "r", stdin);
36 #endif
37     int T;
38     scanf("%d", &T);
39     while (T--)
40     {
41         scanf("%d%d", &r, &c);
42         r--;
43         c--;
44         memset(vis, 0, sizeof(vis));
45         vis[0][r] = 1;
46         vis[1][c-r+N] = 1;
47         vis[2][c+r] = 1;
48         ans[c] = r;
49         kase = 0;
50         printf("SOLN       COLUMN\n");
51         printf(" #      1 2 3 4 5 6 7 8\n\n");
52         search(0);
53         if (T)  printf("\n");
54     }
55     return 0;
56 }
View Code

  为了提高时间,可以预先打表,貌似只有92种方案,然后从中选择就可以了。

转载于:https://www.cnblogs.com/xiaobaibuhei/p/3301379.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值