C语言 · 8皇后问题改编

8皇后问题(改编)

问题描述
  规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
输入格式
  一个8*8的棋盘。
输出格式
  所能得到的最大数字和
样例输入
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
 
样例输出
260
数据规模和约定
  棋盘上的数字范围0~99
 

注释:递归题。

棋盘:qipan[i][j];

递归参数:当前行:begin;当前八皇后所在格子数字之和:sum;

递归出口:至多有8个皇后;

每轮操作都要判断选中位置的行、列、斜三个位置上是否有其他皇后,有则不能放,否则递归下一行(sum=sum+qipan[i][j])——注意标记数组在每一次递归后要恢复。

 1 /*
 2 测试数据: 
 3 1 2 3 4 5 6 7 8
 4 9 10 11 12 13 14 15 16
 5 17 18 19 20 21 22 23 24
 6 25 26 27 28 29 30 31 32
 7 33 34 35 36 37 38 39 40
 8 41 42 43 44 45 46 47 48
 9 48 50 51 52 53 54 55 56
10 57 58 59 60 61 62 63 64
11 */
12 #include<stdio.h>
13 int max=0,sum;//max表预设一个最大值,sum表所放皇后的位置的元素和
14 int lie[9];//代表一竖n行
15 int xie1[2*8];//代表从↖到↘对角线
16 int xie2[2*8];//代表从↘到↖对角线
17 int qipan[9][9];//棋盘权值
18 int ans=0;
19 void HuangHou(int begin,int sum){
20     if(begin>8){//表示搜索到了第八行,说明此次为有效搜索 
21         if(sum>max){
22             max = sum;//max用来存放最大值 
23         }
24         ans++;
25     }else{
26         for(int i=1;i<=8;i++){//表每次搜索都是从第一列开始的 
27             if(lie[i]==0 && xie1[begin+i-1]==0 && xie2[begin-i+8]==0){
28                 lie[i]=1;
29                 xie1[begin+i-1]=1;
30                 xie2[begin-i+8]=1;
31                 HuangHou(begin+1,sum+qipan[begin][i]);//搜索下一行 
32                 lie[i]=0;
33                 xie1[begin+i-1]=0;
34                 xie2[begin-i+8]=0;
35             }
36         }
37     } 
38 }
39 int main(){
40     for(int i=1;i<=8;i++){//录入棋盘 
41         for(int j=1;j<=8;j++){
42             scanf("%d",&qipan[i][j]);
43         }
44     }
45     HuangHou(1,0);//从第一行开始搜索 
46     printf("总方案数:%d\n格子值最大的:%d",ans,max);
47     return 0;
48 }            

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值