华为上机:五子棋
(粤港澳补充题)五子棋
描述:
此题目限定的五子棋规则:
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;
for(int i=0;i<15;i++){
for(int j=0;j<15;j++){
a = -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);
int x = Integer.parseInt(point);
int y = Integer.parseInt(point);
if(a!=-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=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){
inttarget = a;
int count = 1;
int i = x;
int j = y;
// 上下
while(i<14){
i++;
if(a==target){
count++;
}
}
i = x;
while(i>=1){
i--;
if(a==target){
count++;
}
}
if(count>=5){
return true;
}
// 左右
count = 1;
j = y;
while(j<14){
j++;
if(a==target){
count++;
}
}
j = y;
while(j>=1){
j--;
if(a==target){
count++;
}
}
if(count>=5){
return true;
}
// 左上右下
i = x;
j = y;
count = 1;
while(i<14&&j<14){
j++;
i++;
if(a==target){
count++;
}
}
i = x;
j = y;
while(j>=1&&i>=1){
j--;
i--;
if(a==target){
count++;
}
}
if(count>=5){
return true;
}
// 左下右上
i = x;
j = y;
count = 1;
while(i>=1&&j<14){
j++;
i--;
if(a==target){
count++;
}
}
i = x;
j = y;
while(j>=1&&i>14){
j--;
i++;
if(a==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.equals("0")||point.equals("1"))){
// System.out.println(0);
return false;
}
int x = Integer.parseInt(point);
if(x<0 ||x>=15){
// System.out.println("X");
return false;
}
int y = Integer.parseInt(point);
if(y<0 ||y>=15){
// System.out.println("Y");
return false;
}
return true;
}
}
页:
[1]