原题连接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