当前位置:   article > 正文

编程趣味挑战:用c++、java、go三种版本实现2024年高考数学填空压轴题!_高考编程例题

高考编程例题

从高中毕业已经两年的大学牲昨天好奇的看了下今年的高考数学题,其中有一道填空题挺有意思的,废话不多说直接看题!

题目:

分析:

本题实际上是n-皇后算法题的变形,让我们来回顾一下n-皇后这道题:

n−皇后问题是指将 n 个皇后放在 n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现给定阶数n,求出所有的满足条件的棋子摆法。

本题的不同之处在于只需满足每行每列有且仅有一个皇后即可。

核心思路:深度优先遍历(DFS)& 每行只有一个方格被选中 & 回溯

  • 函数 void dfs(int r) : 表示从第r行开始选方格
  • 递归结束判定:当 r > n 时说明已经处理完最后一行了,即一种方案,此时cnt ++。

  • 枚举第 r 行第 i 列:当第 r 行第 i 列没有被选中时,说明可以选,标记 (r , i)、cor(i)为true;然后递归处理第 r + 1 行,还原状态。

  • 计算最大值:当一种方案出现时,该方案中所有的格子,若某个格子被标记为true,则 sum += 第 (i , j) 格子的数值,最终结果取每种方案的最大值即可。

代码: 

C++版本:

  1. #include <iostream>
  2. using namespace std;
  3. const int N = 100;
  4. int q[N][N];
  5. int cor[N];
  6. int n,cnt,sum,rel;
  7. bool flag[N][N];
  8. void dfs(int r){
  9. if (r > n) {
  10. for (int i = 1; i <= n; i++)
  11. for (int j = 1; j <= n; j++) {
  12. if (flag[i][j]) sum+=q[i][j];
  13. }
  14. cnt++;
  15. rel = max(rel,sum);
  16. sum = 0;
  17. return;
  18. }
  19. for(int i = 1; i <= n; i++)
  20. {
  21. if(!cor[i])
  22. {
  23. flag[r][i] = true;
  24. cor[i] = 1;
  25. dfs(r + 1);
  26. cor[i] = 0;
  27. flag[r][i] = false;
  28. }
  29. }
  30. }
  31. int main() {
  32. cin >> n;
  33. for(int i = 1;i <= n;i++)
  34. for (int j = 1; j <= n; j++) cin >> q[i][j];
  35. dfs(1);
  36. cout << "第一空:" << cnt << endl;
  37. cout << "第二空: " << rel << endl;
  38. return 0;
  39. }

JAVA版本:

  1. import java.util.Scanner;
  2. public class Nqueen {
  3. static final int N = 100;
  4. static int[][] q = new int[N][N];
  5. static int[] cor = new int[N];
  6. static boolean[][] flag = new boolean[N][N];
  7. static int n, cnt, sum, rel;
  8. static void dfs(int r) {
  9. if (r > n) {
  10. sum = 0;
  11. for (int i = 1; i <= n; i++) {
  12. for (int j = 1; j <= n; j++) {
  13. if (flag[i][j]) {
  14. sum += q[i][j];
  15. }
  16. }
  17. }
  18. cnt++;
  19. rel = Math.max(rel, sum);
  20. return;
  21. }
  22. for (int i = 1; i <= n; i++) {
  23. if (cor[i] == 0) {
  24. flag[r][i] = true;
  25. cor[i] = 1;
  26. dfs(r + 1);
  27. cor[i] = 0;
  28. flag[r][i] = false;
  29. }
  30. }
  31. }
  32. public static void main(String[] args) {
  33. Scanner scanner = new Scanner(System.in);
  34. n = scanner.nextInt();
  35. for (int i = 1; i <= n; i++) {
  36. for (int j = 1; j <= n; j++) {
  37. q[i][j] = scanner.nextInt();
  38. }
  39. }
  40. dfs(1);
  41. System.out.println("第一空:" + cnt);
  42. System.out.println("第二空: " + rel);
  43. }
  44. }

GO版本:

  1. package main
  2. import "fmt"
  3. const N = 100
  4. var (
  5. q [N][N]int
  6. cor [N]int
  7. flag [N][N]bool
  8. n, cnt, sum, rel int
  9. )
  10. func dfs(r int) {
  11. if r > n {
  12. sum = 0
  13. for i := 1; i <= n; i++ {
  14. for j := 1; j <= n; j++ {
  15. if flag[i][j] {
  16. sum += q[i][j]
  17. }
  18. }
  19. }
  20. cnt++
  21. if sum > rel {
  22. rel = sum
  23. }
  24. return
  25. }
  26. for i := 1; i <= n; i++ {
  27. if cor[i] == 0 {
  28. flag[r][i] = true
  29. cor[i] = 1
  30. dfs(r + 1)
  31. cor[i] = 0
  32. flag[r][i] = false
  33. }
  34. }
  35. }
  36. func main() {
  37. fmt.Scan(&n)
  38. for i := 1; i <= n; i++ {
  39. for j := 1; j <= n; j++ {
  40. fmt.Scan(&q[i][j])
  41. }
  42. }
  43. dfs(1)
  44. fmt.Println("第一空:", cnt)
  45. fmt.Println("第二空: ", rel)
  46. }

输出结果:

c++:

java:

go:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/789079
推荐阅读
相关标签
  

闽ICP备14008679号