挑战编程 程序设计竞赛训练手册-1.6.7 将军(Check_the_Check)
2013-01-23 03:49
676 查看
挑战编程 程序设计竞赛训练手册-1.6.7 将军(Check_the_Check)
![](http://img.my.csdn.net/uploads/201301/23/1358884177_4684.jpg)
![](http://img.my.csdn.net/uploads/201301/23/1358884205_6059.jpg)
![](http://img.my.csdn.net/uploads/201301/23/1358884248_5228.jpg)
![](http://img.my.csdn.net/uploads/201301/23/1358884177_4684.jpg)
![](http://img.my.csdn.net/uploads/201301/23/1358884205_6059.jpg)
![](http://img.my.csdn.net/uploads/201301/23/1358884248_5228.jpg)
public class problem_Check_The_Check { /**1.思路问题:直接判断王周围能够被将军的线路的布子情况更简单易行 * 2.哨兵 能有效解决越界问题 * 3.通个了宵完成的…… * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub char[][] check1 = { //大写表示白子,小写表示黑子 {'.','.','k','.','.','.','.','.'}, {'p','p','p','.','p','p','p','p'}, {'.','.','.','.','.','.','.','.'}, {'.','.','.','.','.','B','.','.'}, {'.','.','.','.','.','.','.','.'}, {'.','.','.','.','.','.','.','.'}, {'P','P','P','P','P','P','P','P'}, {'K','.','.','.','.','.','.','.'}, }; char[][] check = { //大写表示白子,小写表示黑子 {'r','n','b','q','k','.','n','r'}, {'p','p','p','.','.','p','p','p'}, {'.','.','.','.','p','.','.','.'}, {'.','.','.','P','.','.','.','.'}, {'.','b','P','P','.','.','.','.'}, {'.','.','.','.','.','.','.','.'}, {'P','P','.','.','P','P','P','P'}, {'R','N','B','Q','K','B','.','R'}, }; /*循环棋盘,记录两个王的位置*/ int rK[]=kKPosition(check);//[0]k行的位置,[1]k列的位置 //[2]K行的位置,[3]K列的位置 /*判断黑子k是否被将军*/ if(judgekChecked(check,rK[0],rK[1])){ System.out.println("black king is in check"); } if(judgeKChecked(check,rK[2],rK[3])){ System.out.println("white king is in check"); } } private static boolean judgeKChecked(char[][] check, int i, int j) { // TODO Auto-generated method stub boolean white = false; int x ;//记录行,列中较小值 /* 如果k的左上角或右上角有对手,且棋子为p或者b或者q 皆可将军*/ if(i-1>=0&&j-1>=0&&check[i-1][j-1]=='p'||i-1>=0&&j-1>=0&&check[i-1][j-1]=='b'||i-1>=0&&j-1>=0&&check[i-1][j-1]=='q' ||i-1>=0&&j+1<8&&check[i-1][j+1]=='p'||i-1>=0&&j+1<8&&check[i-1][j+1]=='b'||i-1>=0&&j+1<8&&check[i-1][j+1]=='q'){ white = true; } /*判断被马将的情况*/ if((i-2>=0&&j-1>=0&&check[i-2][j-1]=='n')|| (i-2>=0&&j+1<8&&check[i-2][j+1]=='n')|| (i+2<8&&j-1>=0&&check[i+2][j-1]=='n')|| (i+2<8&&j+1<8&&check[i+2][j+1]=='n')|| (i-1>=0&&j-2>=0&&check[i-1][j-2]=='n')|| (i-1>=0&&j+2<8&&check[i-1][j+2]=='n')|| (i+1<8&&j-2>=0&&check[i+1][j-2]=='n')|| (i+1<8&&j+2<8&&check[i+1][j+2]=='n')){ white = true; } /*判断k在周围的情况*/ if(i+1<8&&j+1<8&&check[i+1][j+1]=='k'|| j+1<8&&check[i][j+1]=='k'|| i-1>=0&&j+1<8&&check[i-1][j+1]=='k'|| i-1>=0&&check[i-1][j]=='k'|| i-1>=0&&j-1>=0&&check[i-1][j-1]=='k'|| i+1<8&&j-1>=0&&check[i+1][j-1]=='k'|| i+1<8&&check[i+1][j]=='k'|| j-1>=0&&check[i][j-1]=='k'){ white=true; } /*上线段上有对手,且棋子为r或者q*/ for(int a=i-1;a>=0;a--){ if(check[a][j]<'a'&&check[a][j]>'.'){ //如有阻碍则推出判断 .-46 A-65 a-97 break; }else{ if(check[a][j]=='r'||check[a][j]=='q'){ white=true; } } } //下线段上有对手,且棋子为r或者q for(int a=i+1;a<8;a++){ if((check[a][j]<'a'&&check[a][j]>'.')){ //如有阻碍则推出判断 break; }else{ if(check[a][j]=='r'||check[a][j]=='q'){ white=true; } } } //右线段上有对手,且棋子为r或者q for(int a=j+1;a<8;a++){ if((check[i][a]<'a'&&check[i][a]>'.')){ //如有阻碍则推出判断 break; }else{ if(check[i][a]=='r'||check[i][a]=='q'){ white=true; } } } //左线段上有对手,且棋子为r或者q for(int a=j-1;a>=0;a--){ if((check[i][a]<'a'&&check[i][a]>'.')){ //如有阻碍则推出判断 break; }else{ if(check[i][a]=='r'||check[i][a]=='q'){ white=true; } } } //左上线段有对手,且棋子为b或者q for(int a=1;a<((i<j)?i:j);a++){//循环取行,列中较小的一个,以免出界 if((check[i-a][j-a]<'a'&&check[i-a][j-a]>'.')){ //如有阻碍则推出判断 break; }else{ if(check[i-a][j-a]=='b'||check[i-a][j-a]=='q'){ white=true; } } } //右上线段有对手,且棋子为b或者q for(int a=1;a<=((i<8-j)?i:8-j);a++){//循环取行,列中较小的一个,以免出界 if((i-a>=0&&j+a<8&&check[i-a][j+a]<'a'&&check[i-a][j+a]>'.')){ //如有阻碍则推出判断 break; }else{ if(i-a>=0&&j+a<8&&check[i-a][j+a]=='b'||i-a>=0&&j+a<8&&check[i-a][j+a]=='q'){ white=true; } } } //右下线段有对手,且棋子为b或者q for(int a=1;a<((8-i<8-j)?8-i:8-j);a++){//循环取行,列中较小的一个,以免出界 if((check[i+a][j-a]<'a'&&check[i+a][j-a]>'.')){ //如有阻碍则推出判断 break; }else{ if(check[i+a][j-a]=='b'||check[i+a][j-a]=='q'){ white=true; } } } //左下线段有对手,且棋子为b或者q for(int a=1;a<((8-i<j)?8-i:j);a++){//循环取行,列中较小的一个,以免出界 if((i+a<8&&j-a>=0&&check[i+a][j-a]<'a')&&check[i+a][j-a]>'.'){ //如有阻碍则推出判断 break; }else{ if(i+a<8&&j-a>=0&&check[i+a][j-a]=='b'||i+a<8&&j-a>=0&&check[i+a][j-a]=='q'){ white=true; } } } return white; } private static boolean judgekChecked(char[][] check, int i, int j) { // TODO Auto-generated method stub boolean black = false; int x ;//记录行,列中较小值 /*如果k的左下角或右下角有对手,且棋子为P或者B或者Q 皆可将军*/ if(i+1<8&&j-1>=0&&check[i+1][j-1]=='P'||i+1<8&&j-1>=0&&check[i+1][j-1]=='B'||i+1<8&&j-1>=0&&check[i+1][j-1]=='Q' ||i+1<8&&j+1<8&&check[i+1][j+1]=='P'||i+1<8&&j+1<8&&check[i+1][j+1]=='B'||i+1<8&&j+1<8&&check[i+1][j+1]=='Q'){ black = true; } /*判断被马将的情况*/ if((i-2>=0&&j-1>=0&&check[i-2][j-1]=='N')|| (i-2>=0&&j+1<8&&check[i-2][j+1]=='N')|| (i+2<8&&j-1>=0&&check[i+2][j-1]=='N')|| (i+2<8&&j+1<8&&check[i+2][j+1]=='N')|| (i-1>=0&&j-2>=0&&check[i-1][j-2]=='N')|| (i-1>=0&&j+2<8&&check[i-1][j+2]=='N')|| (i+1<8&&j-2>=0&&check[i+1][j-2]=='N')|| (i+1<8&&j+2<8&&check[i+1][j+2]=='N')){ black = true; } /*判断K在周围的情况*/ if(i+1<8&&j+1<8&&check[i+1][j+1]=='K'|| j+1<8&&check[i][j+1]=='K'|| i-1>=0&&j+1<8&&check[i-1][j+1]=='K'|| i-1>=0&&check[i-1][j]=='K'|| i-1>=0&&j-1>=0&&check[i-1][j-1]=='K'|| i+1<8&&j-1>=0&&check[i+1][j-1]=='K'|| i+1<8&&check[i+1][j]=='K'|| j-1>=0&&check[i][j-1]=='K'){ black=true; } /*上线段上有对手,且棋子为R或者Q或者K*/ for(int a=i-1;a>=0;a--){ if(check[a][j]>'a'){ //如有阻碍则推出判断 .-46 A-65 a-97 break; }else{ if(check[a][j]=='R'||check[a][j]=='Q'){ black=true; } } } //下线段上有对手,且棋子为R或者Q for(int a=i+1;a<8;a++){ if((check[a][j]>'a')){ //如有阻碍则推出判断 break; }else{ if(check[a][j]=='R'||check[a][j]=='Q'){ black=true; } } } //右线段上有对手,且棋子为R或者Q for(int a=j+1;a<8;a++){ if((check[i][a]>'a')){ //如有阻碍则推出判断 break; }else{ if(check[i][a]=='R'||check[i][a]=='Q'){ black=true; } } } //左线段上有对手,且棋子为R或者Q for(int a=j-1;a>=0;a--){ if((check[i][a]>'a')){ //如有阻碍则推出判断 break; }else{ if(check[i][a]=='R'||check[i][a]=='Q'){ black=true; } } } //左上线段有对手,且棋子为B或者Q for(int a=1;a<((i<j)?i:j);a++){//循环取行,列中较小的一个,以免出界 if((check[i-a][j-a]>'a')){ //如有阻碍则推出判断 break; }else{ if(check[i-a][j-a]=='B'||check[i-a][j-a]=='Q'){ black=true; } } } //右上线段有对手,且棋子为B或者Q for(int a=1;a<=((i<8-j)?i:8-j);a++){//循环取行,列中较小的一个,以免出界 if((i-a>=0&&j+a<8&&check[i-a][j+a]>'a')){ //如有阻碍则推出判断 break; }else{ if(i-a>=0&&j+a<8&&check[i-a][j+a]=='B'||i-a>=0&&j+a<8&&check[i-a][j+a]=='Q'){ black=true; } } } //右下线段有对手,且棋子为B或者Q for(int a=1;a<((8-i<8-j)?8-i:8-j);a++){//循环取行,列中较小的一个,以免出界 if((check[i+a][j-a]>'a')){ //如有阻碍则推出判断 break; }else{ if(check[i+a][j-a]=='B'||check[i+a][j-a]=='Q'){ black=true; } } } //左下线段有对手,且棋子为B或者Q for(int a=1;a<((8-i<j)?8-i:j);a++){//循环取行,列中较小的一个,以免出界 if((i+a<8&&j-a>=0&&check[i+a][j-a]>'a')){ //如有阻碍则推出判断 break; }else{ if(i+a<8&&j-a>=0&&check[i+a][j-a]=='B'||i+a<8&&j-a>=0&&check[i+a][j-a]=='Q'){ black=true; } } } return black; } public static int[] kKPosition(char[][] check){//用一维数组记录坐标 i,j每隔两位为一个坐标 int kingPosition[]=new int[4]; for(int i=0;i<check.length;i++){ for(int j=0;j<check[i].length;j++){ if(check[i][j]=='k'){ kingPosition[0]=i; kingPosition[1]=j; }else if(check[i][j]=='K'){ kingPosition[2]=i; kingPosition[3]=j; } } } return kingPosition; } }
![](http://img.my.csdn.net/uploads/201301/23/1358884400_5962.jpg)
相关文章推荐
- 挑战编程 程序设计竞赛训练手册-1.6.3 旅行(The Trip)
- 挑战编程 程序设计竞赛训练手册-1.6.6 解释器(Interpreter)
- 挑战编程 程序设计竞赛训练手册-1.6.8 澳大利亚投票(Australian Voting)
- 挑战编程程序设计竞赛训练手册(Programming Challenges)
- 序-挑战编程 程序设计竞赛训练手册
- 挑战编程 程序设计竞赛训练手册-1.6.1 3n+1问题(3n+1 Problem)
- 挑战编程 程序设计竞赛训练手册-1.6.2 扫雷(Minesweeper)
- 挑战编程 程序设计竞赛训练手册-1.6.4 液晶显示屏(LC-Display)
- 挑战编程 程序设计竞赛训练手册-1.6.5 图形化编辑器(Graphical Editor)
- 1.6.7 将军 Check the Check
- 系统性训练,励志刷完挑战程序设计竞赛-代码整理135~【中级篇】
- ACM题解系列之八:(美)斯基纳等:《挑战编程-程序设计竞赛训练手册》
- 程序设计竞赛ACM训练手册--从入门到精通
- 系统性训练,励志刷完挑战程序设计竞赛-代码整理1~42【初级篇】
- (挑战编程_1_7)Check The Check
- 1.6.7将军(Check the Check)UVa 10196 // PC 1101017 // acmclub.com 25177
- 系统性训练,励志刷完挑战程序设计竞赛-代码整理43~68【初级篇】
- 系统性训练,励志刷完挑战程序设计竞赛-代码整理68~103【初级篇】
- 系统性训练,励志刷完挑战程序设计竞赛-代码整理103~134【初级篇】
- 水洼 POJ2386 挑战程序设计竞赛