设为首页 收藏本站
查看: 1182|回复: 0

[经验分享] 华为上机:五子棋

[复制链接]

尚未签到

发表于 2017-7-10 07:58:07 | 显示全部楼层 |阅读模式
(粤港澳补充题)五子棋
描述:  此题目限定的五子棋规则:
  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[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[y]==target){
count++;
}
}
i = x;
while(i>=1){
i--;
if(a[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[j]==target){
count++;
}
}
i = x;
j = y;
while(j>=1&&i>=1){
j--;
i--;
if(a[j]==target){
count++;
}
}
if(count>=5){
return true;
}
// 左下右上
i = x;
j = y;
count = 1;
while(i>=1&&j<14){
j++;
i--;
if(a[j]==target){
count++;
}
}
i = x;
j = y;
while(j>=1&&i>14){
j--;
i++;
if(a[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;
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392223-1-1.html 上篇帖子: 让任正非愤怒的到底是华为财管团队还是流程本身? 下篇帖子: 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表