蓝桥杯,算法提高,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
---------分割线--------
此题就比较简单啦,记录当前所有方案之中数字之和最大的那个然后输出就行了,对N后问题有什么疑问的可以去看我的上一篇blog.
1 #include<stdio.h> 2 int a[8][8]; 3 int vis[3][20]={0}; 4 int t=0; 5 int x=0; 6 int s=0; 7 void dfs(int cur) 8 { 9 int i; 10 if(cur==8) 11 { 12 if(s<x) 13 s=x; 14 } 15 else for(i=0;i<8;i++) 16 { 17 if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+8]) 18 { 19 vis[0][i]=vis[1][cur+i]=vis[2][cur-i+8]=1; 20 x+=a[cur][i]; 21 dfs(cur+1); 22 vis[0][i]=vis[1][cur+i]=vis[2][cur-i+8]=0; 23 x-=a[cur][i]; 24 } 25 } 26 } 27 int main() 28 { 29 int i,j,max; 30 for(i=0;i<8;i++) 31 for(j=0;j<8;j++) 32 scanf("%d",&a[i][j]); 33 dfs(0); 34 printf(" %d\n",s); 35 return 0; 36 }