象棋( Xiangqi, ACM/ICPC Fuzhou 2011, UVa1589)

原题连接uva1589

提交uva,ac

说下解题思路:题中描述的象棋规则和我们平时玩的一样,题目给的条件是,黑方只剩一个将,红方有一个帅,还可能有车马炮,现在红方将军,黑方走,需求是让我门判断红方是否把黑方将死.让黑将走所有可能走的位置,然后判断红方能不能吃掉黑将,如果有一个位置红方所有棋子都吃不到黑将,那么就是没将死,否则就是将死了

1.确定黑方将军能走的所有位置,如果黑将旁边有棋子,那一定是红方的,所以黑将可以吃掉它,这也是可能走的位置,走完之后,黑将原来的位置就是空的了

2.遍历用红方的所有棋子,看能否吃掉黑将,只要有一个能吃掉黑将,那么就换黑将能走的下一个位置,如果黑将能走的所有位置都可以被红方吃掉,那么就是将死了.

大体思路就这样了,用ArrayList存红方的棋子,就算红方有2个车,直接遍历ArrayList也都能取出来.题中的判断都用 && || 这个有短路功能,提高效率

import java.util.ArrayList;
import java.util.Scanner;

/*
 * 习题4-1 象棋( Xiangqi, ACM/ICPCFuzhou 2011, UVa1589)
考虑一个象棋残局, 其中红方有n(2≤n≤7)个棋子, 黑方只有一个将。 红方除了有一个帅
(G) 之外还有3种可能的棋子: 车(R) , 马(H) , 炮(C) , 并且需要考虑“蹩马腿”(如图
4-4所示) 与将和帅不能照面(将、 帅如果同在一条直线上, 中间又不隔着任何棋子的情况下, 走
子的一方获胜) 的规则。
输入所有棋子的位置, 保证局面合法并且红方已经将军。 你的任务是判断红方是否已经把黑
方将死。 关于中国象棋的相关规则请参见原题。
 */
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 封装成循环
		ArrayList<String> result = new ArrayList<String>();
		while(true){
			//定义10*9的二维矩阵,索引1-10,1-9
			int[][] qiPan = new int[11][10];
			//黑方将10,红方将20,红车1,红马2,红炮3,输入数据到棋盘
			String[] numArr = sc.nextLine().split(" ");
			int n1 = Integer.parseInt(numArr[0]);
			int xHei = Integer.parseInt(numArr[1]);
			int yHei = Integer.parseInt(numArr[2]);
			if(n1==0) break;
			qiPan[xHei][yHei] = 10;
			ArrayList<int[]> list = new ArrayList<int[]>();//接收输入的信息
			for (int i = 0; i < n1; i++) {
				String[] strArr = sc.nextLine().split(" ");
				int[] arr1 = new int[3];
				arr1[1] = Integer.parseInt(strArr[1]);
				arr1[2] = Integer.parseInt(strArr[2]);
				switch (strArr[0]) {
				case "G":
					qiPan[arr1[1]][arr1[2]]= 20;
					arr1[0] = 20;
					break;
				case "R":
					qiPan[arr1[1]][arr1[2]]= 1;
					arr1[0] = 1;
					br
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值