(粤港澳补充题)五子棋 | |
描述: |
此题目限定的五子棋规则: 1、棋盘大小:15*15 2、分为黑棋和白棋,一种颜色棋子不论横、竖、斜连成5个或大于5个算赢 3、黑白交替下,也就是说一方不能连续2次成功落子。 要求:根据双方落子,进行有效性判断和胜负判断。 |
运行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: |
输入一行或多行,每行包括三个整数,分别是棋子类型,棋子的横坐标,棋子的纵坐标,以空格隔开 棋子类型:0 黑棋,1 白棋 棋子坐标从0开始,小于15。 |
输出: |
针对每行输入,如果: 黑方胜,输出1; 白方胜,输出2; 落子失败,比如坐标错误,或顺序错,输出-1; 其他情况:落字成功,不输出; 胜负一旦确定,测试用例就结束。 |
样例输入: |
0 7 7
1 7 8
0 7 7
1 7 5
0 8 8
1 9 9
0 6 6
1 8 9
0 5 5
1 7 9
0 4 4
|
样例输出: |
-1
-1
1
|
解题
判断是否连成五指棋比较简单,判断合法的下棋顺序话费了很长时间
import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner; public class Main3{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int[][] a = new int[15][15]; for(int i=0;i<15;i++){ for(int j=0;j<15;j++){ a[i][j] = -1; } } int i = 0; int first = 1; int next = 2; int target = -1; while(in.hasNext()){ String[] point = in.nextLine().split(" "); if(!isLeague(point)){ System.out.println("-1"); continue; } int opt = Integer.parseInt(point[0]); int x = Integer.parseInt(point[1]); int y = Integer.parseInt(point[2]); if(a[x][y]!=-1){ System.out.println("-1"); continue; } if(i==0){ // 第0次下棋:first 1 next 2 first = 2 ;// 下一次棋子 next = 1; i++; target = opt;// 第0次下的棋子 }else{ if(i%2==0){ if(target != opt){// 偶数位和第0次下的棋子应该一样 first 1 next 2 System.out.println("-1"); continue; } if(first==1&&next==2){ // 判断是否是该子下棋,是的更新到下一个下棋棋子 first = 2; next = 1; i++; }else{ System.out.println("-1"); continue; } }else{ if(target == opt){ // 偶数位和第0次下的棋子不应该一样 System.out.println("-1"); continue; } if(first==2&&next==1){ // 判断是否是该子下棋,是的更新到下一个下棋棋子 first = 1; next = 2; i++; }else{ System.out.println("-1"); continue; } } } a[x][y]=opt; if(isWin(a,x,y)){ if(opt==0){ System.out.println("1"); }else{ System.out.println("2"); } break; } } in.close(); } /** * 四个方向判断是否赢 * @param a * @param x * @param y * @return */ public static boolean isWin(int[][] a,int x,int y){ int target = a[x][y]; int count = 1; int i = x; int j = y; // 上下 while(i<14){ i++; if(a[i][y]==target){ count++; } } i = x; while(i>=1){ i--; if(a[i][y]==target){ count++; } } if(count>=5){ return true; } // 左右 count = 1; j = y; while(j<14){ j++; if(a[x][j]==target){ count++; } } j = y; while(j>=1){ j--; if(a[x][j]==target){ count++; } } if(count>=5){ return true; } // 左上右下 i = x; j = y; count = 1; while(i<14&&j<14){ j++; i++; if(a[i][j]==target){ count++; } } i = x; j = y; while(j>=1&&i>=1){ j--; i--; if(a[i][j]==target){ count++; } } if(count>=5){ return true; } // 左下右上 i = x; j = y; count = 1; while(i>=1&&j<14){ j++; i--; if(a[i][j]==target){ count++; } } i = x; j = y; while(j>=1&&i>14){ j--; i++; if(a[i][j]==target){ count++; } } if(count>=5){ return true; } return false; } /** * 输入是否合法 * @param point * @return */ public static boolean isLeague(String[] point){ if(point==null ||point.length!=3){ return false; } if(!(point[0].equals("0")||point[0].equals("1"))){ // System.out.println(0); return false; } int x = Integer.parseInt(point[1]); if(x<0 ||x>=15){ // System.out.println("X"); return false; } int y = Integer.parseInt(point[2]); if(y<0 ||y>=15){ // System.out.println("Y"); return false; } return true; } }