马经过了

 马经顺利通过,这学期的压力也减轻了一些,另外对于c++的学习感觉光靠看书实在是掌握不了太多的东西,所以最近要多写点程序。在网上找了一个五子棋的题目,想最终实现网络对弈,昨晚写了一点,基本上实现了走棋和判别胜负的功能,但是对于在dos下面如何画棋盘却不太了解.上网搜索了一下,只能通过c语言的graphics.h来画直线,可是c++里面又没有这个头文件。。。头疼ing....另外对于字符数组方面的知识要好好加强一下

知识点:数组不能用初始化列表初始化。
               只能用for循环在函数体里进行。

 

方向键:

先定义方向键的扩展的ASCⅡ码
#define UP    0x4800
#define DOWN  0x5000
#define LEFT  0x4b00
#define RIGHT 0x4d00         /*这些可以由bioskey(0)获得*/

然后在主函数中用一变量获得key=bioskey(0),在switch 中用key做标号,对应刚才定义的键码常量,做相应的操作

### Java 递归实现思路及代码 要解决在 $n × m$ 棋盘上,从 $(1, 1)$ 位置开始,让按照特定优先级走日字,找到一条使所有位置恰好经过一次的路径的问题,可以采用回溯法结合递归的方式。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。 以下是 Java 代码实现: ```java import java.util.Arrays; public class KnightTour { private static final int N = 8; // 棋盘最大尺寸 private static final int[][] moves = { {-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {2, -1}, {2, 1} }; // 走“日”字的 8 个可能方向 private int n, m; private int[][] board; public KnightTour(int n, int m) { this.n = n; this.m = m; this.board = new int[n][m]; for (int[] row : board) { Arrays.fill(row, -1); } } public boolean solveKT() { board[0][0] = 0; // 从 (1, 1) 位置开始,数组下标为 (0, 0) return solveKTUtil(0, 0, 1); } private boolean solveKTUtil(int x, int y, int movei) { if (movei == n * m) { return true; } for (int k = 0; k < 8; k++) { int nextX = x + moves[k][0]; int nextY = y + moves[k][1]; if (isSafe(nextX, nextY)) { board[nextX][nextY] = movei; if (solveKTUtil(nextX, nextY, movei + 1)) { return true; } else { board[nextX][nextY] = -1; // 回溯 } } } return false; } private boolean isSafe(int x, int y) { return (x >= 0 && x < n && y >= 0 && y < m && board[x][y] == -1); } public void printSolution() { if (solveKT()) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { System.out.printf("%3d", board[i][j]); } System.out.println(); } } else { System.out.println("QAQ"); } } public static void main(String[] args) { int n = 8; int m = 8; KnightTour kt = new KnightTour(n, m); kt.printSolution(); } } ``` ### 代码解释 1. **初始化部分**: - `N` 定义了棋盘的最大尺寸,这里设为 8。 - `moves` 数组存储了走“日”字的 8 个可能方向。 - `KnightTour` 类的构造函数初始化了棋盘大小 `n` 和 `m`,并将棋盘 `board` 初始化为 -1,表示所有位置都未被访问。 2. **solveKT 方法**: - 该方法是解决骑士巡游问题的入口,将起始位置 `(0, 0)` 标记为第 0 步,然后调用 `solveKTUtil` 方法开始递归搜索。 3. **solveKTUtil 方法**: - 这是递归的核心方法,参数 `x` 和 `y` 表示当前的位置,`movei` 表示当前是第几步。 - 如果 `movei` 等于 `n * m`,说明已经遍历完所有位置,返回 `true`。 - 尝试 8 个可能的方向,对于每个方向,检查新位置是否安全(未越界且未被访问)。 - 如果安全,将该位置标记为当前步数,递归调用 `solveKTUtil` 方法继续搜索。 - 如果递归调用返回 `false`,说明该路径不可行,将该位置标记为未访问(回溯)。 4. **isSafe 方法**: - 该方法用于检查给定的位置 `(x, y)` 是否在棋盘内且未被访问。 5. **printSolution 方法**: - 调用 `solveKT` 方法尝试解决问题,如果找到解,则打印棋盘;否则输出“QAQ”。 6. **main 方法**: - 创建 `KnightTour` 对象,设置棋盘大小为 8×8,调用 `printSolution` 方法输出结果。 ### 复杂度分析 - **时间复杂度**:由于使用了回溯法,最坏情况下的时间复杂度为 $O(8^{n*m})$,因为在每个位置都有 8 个可能的方向可以选择。 - **空间复杂度**:主要是递归栈的空间,空间复杂度为 $O(n*m)$。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值