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
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 }