云课堂程序设计入门-java语言之井字棋

3次阅读
没有评论

题目内容

程序先要读入一个整数n,范围是[3,100],这表示井字棋棋盘的边长。比如n=3就表示是一个3×3的棋盘。然后,要读入n行,每行n个数字,每个数字是1或0,依次表示[0,0]到[n-1,n-1]位置上的棋子。1表示X,0表示O(大写字母O)。

你的程序要判断其中是否存在某一方获胜,获胜的条件是存在整行或整列或整条对角线或整条反对角线上是相同的棋子。如果存在,则输出代表获胜一方字母:X或O(大写字母X或O);如果没有任何一方获胜,则输出NIL(三个大写字母,中间是字母I(India的I)。

注意:所给的棋盘上的棋子分布可能出现同一个棋子有多处满足获胜的条件,但是不会出现两种棋子都获胜的情况。

输入格式:

一个代表棋盘大小的数字n,后面跟上nxn个0或1的数字。

输出格式:

三种输出之一:

  1. X
  2. O
  3. NIL

均为大写字母。

java代码

    import java.util.Scanner;
      
    public class Main {
          
    //n*n,数组对应关系
    //例子4*4
    //       0    1    1    0  s[0]
    //       1    0    0    0  s[2]
    //       1    0    0    0  s[4]
    //       1    0    0    0  s[6]
    //s[9] s[1] s[3] s[4] s[7] s[8]
    //横向i*2,纵向j*2+1,对角线2n,2n+1
    //s数组存储比较结果,如果出现不相同的就赋值-1,否则记录该行/列/对角线的统一的值
      
        public static void main(String[] args) {
            Scanner initdata= new Scanner(System.in);
            int num=initdata.nextInt();//n
            int i=0;
            int j=0;
            int temp;
            int ifwin=0;
            int[] s=new int[205];
            for(i=0;i<num;i++){
                for (j=0;j<num;j++){
                    temp=initdata.nextInt();
                    //每次读入进行四次判断,行、列、两对角线
                    //列记录的初始化和后续比较
                    if (i==0){
                        s[j*2+1]=temp;
                    }else{
                        if (s[j*2+1]!=temp&&s[j*2+1]!=-1){
                            s[j*2+1]=-1;
                        }
                    }
                    //行记录的初始化和后续比较  
                    if (j==0){
                        s[i*2]=temp;
                    }else{
                        if (s[i*2]!=temp&&s[i*2]!=-1){
                            s[i*2]=-1;
                        }
                    }
                    //对角线“\”记录的初始化和后续比较             
                    if(i==0&&j==0){
                        s[2*num]=temp;
                    }else{
                        if(i==j&&temp!=s[2*num]&&s[2*num]!=-1){
                            s[2*num]=-1;
                        }
                    }
                    //对角线“/”记录的初始化和后续比较
                    if(i==0&&j==num-1){
                        s[2*num+1]=temp;
                    }else{
                        if(i+j==num-1&&temp!=s[2*num+1]&&s[2*num+1]!=-1){
                            s[2*num+1]=-1;
                        }
                    }   
                }
            }
            //检查比较结果并输出
            for(i=0;i<2*num+2;i++){
                if (s[i]!=-1){
                    ifwin=1;
                    if(s[i]==0){
                        System.out.print("O");
                    }else{
                        System.out.print("X");
                    }
                    break;
                }
            }
            if(ifwin==0){
                System.out.print("NIL");
            }
        }
    }