【马踏棋盘算法java,使用贪心算法优化】

骑士周游问题

马踏棋盘算法

import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class HorseChessBoard {
    private static int X;//棋盘的列数
    private static int Y;//棋盘的行数
    private static boolean isFinished = false;//记录是否完成比赛
    public static void main(String[] args) {
        X = 6;
        Y = 6;
        //起始位置
        int row = 1;//初始的行,是纵轴Y
        int col = 1;//初始的列,是横轴X
        int[][] chessBoard = new int[Y][X];//原始棋盘,注意访问顺序与X,Y轴不同之处
        long start = System.currentTimeMillis();
        backTracing(chessBoard, row, col, 1);
        long end = System.currentTimeMillis();
        System.out.println(end - start + "ms");
        for (int[] rows : chessBoard) {
            System.out.println(Arrays.toString(rows));
        }
    }
    private static void backTracing(int[][] chessBoard, int row, int col, int step) {
        chessBoard[row][col] = step;//当前的位置标记为第step步
        List<Point> points = getNext(row, col);
        points.sort(new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                return getNext(o1.y,o1.x).size() - getNext(o2.y, o2.x).size();
            }
        });
        while(points.size() > 0) {
            Point point = points.remove(0);
            if(chessBoard[point.y][point.x] == 0){
                backTracing(chessBoard, point.y, point.x, step + 1);
            }
        }
        //先判断是否完成比赛
        if(step == X * Y || isFinished) {
            isFinished = true;
        } else {
            //回溯
            chessBoard[row][col] = 0;
        }
    }
    private static List<Point> getNext(int row, int col) {
        List<Point> points = new ArrayList<>();
        int x = 0, y = 0;
        if((y = row - 1) >= 0 && (x = col - 2) >= 0) {
            points.add(new Point(x, y));
        }
        if((y = row - 2) >= 0 && (x = col - 1) >= 0) {
            points.add(new Point(x, y));
        }
        if((y = row - 2) >= 0 && (x = col + 1) < X) {
            points.add(new Point(x, y));
        }
        if((y = row - 1) >= 0 && (x = col + 2) < X) {
            points.add(new Point(x, y));
        }
        if((y = row + 1) < Y && (x = col + 2) < X) {
            points.add(new Point(x, y));
        }
        if((y = row + 2) < Y && (x = col + 1) < X) {
            points.add(new Point(x, y));
        }
        if((y = row + 2) < Y && (x = col - 1) >= 0) {
            points.add(new Point(x, y));
        }
        if((y = row + 1) < Y && (x = col - 2) >= 0) {
            points.add(new Point(x, y));
        }
        return points;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种常见的算法思想,它在求解最优化问题时,每一步都选择当前看起来最优的解决方案,而不考虑全局最优解。对于五子棋这个游戏,贪心算法可以用来制定AI的策略。 在五子棋中,贪心算法可以通过评估当前局面的得分来选择下一步的落子位置。常见的评估方法是通过计算每个位置的连续棋子数来判断该位置的得分,然后选择得分最高的位置进行落子。 以下是一个简单的贪心算法五子棋的C++实现示例: ```cpp #include <iostream> #include <vector> using namespace std; const int SIZE = 15; // 棋盘大小 // 评估函数,计算某个位置的得分 int evaluate(vector<vector<int>>& board, int row, int col, int player) { int score = 0; int dx = {1, 0, 1, 1}; int dy[4] = {0, 1, 1, -1}; for (int i = 0; i < 4; i++) { int count = 0; int x = row, y = col; while (x >= 0 && x < SIZE && y >= 0 && y < SIZE && board[x][y] == player) { count++; x += dx[i]; y += dy[i]; } score += count; } return score; } // 贪心算法,选择得分最高的位置进行落子 void greedyAlgorithm(vector<vector<int>>& board, int player) { int maxScore = 0; int bestRow = -1, bestCol = -1; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (board[i][j] == 0) { int score = evaluate(board, i, j, player); if (score > maxScore) { maxScore = score; bestRow = i; bestCol = j; } } } } board[bestRow][bestCol] = player; } int main() { vector<vector<int>> board(SIZE, vector<int>(SIZE, 0)); // 初始化棋盘 // 玩家1先手落子 int player1 = 1; int row1, col1; cout << "玩家1,请输入落子位置(行 列):"; cin >> row1 >> col1; board[row1][col1] = player1; // AI玩家2贪心算法落子 int player2 = 2; greedyAlgorithm(board, player2); // 输出当前棋盘状态 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { cout << board[i][j] << " "; } cout << endl; } return 0; } ``` 这段代码实现了一个简单的贪心算法五子棋的对战,玩家1先手输入落子位置,然后AI玩家2使用贪心算法选择最优位置进行落子,最后输出当前棋盘状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值