publicclassTicTacToe{publicstaticvoidmain(String[]args){longk=System.nanoTime();int[][]board;if(args.length==0)board=newint[3][3];else{ints;try{s=Integer.parseInt(args[0]);}catch(Exceptione){s=3;}board=newint[s][s];}for(inti=0;i<board.length;i++){for(intj=0;j<board[i].length;j++){board[i][j]=0;}}System.out.println(addPiece(board,true,0,0,0));System.out.println((System.nanoTime()-k)/1E9+" seconds to run");}publicstaticintaddPiece(int[][]board,booleanturn,intturns,intx,inty){intresult=evaluate(board,!turn,x,y);if(result!=0)returnresult;elseif(turns==board.length*board[0].length&&result==0)returnresult;intbest;if(turn)best=-1;elsebest=1;for(inti=0;i<board.length;i++){for(intj=0;j<board[i].length;j++){if(board[i][j]!=0)continue;if(turn)board[i][j]=1;elseboard[i][j]=-1;intresult2=addPiece(board,!turn,turns+1,i,j);board[i][j]=0;if(turn&&result2==1)return1;elseif(!turn&&result2==-1)return-1;if(result2>best&&turn)best=result2;elseif(result2<best&&!turn)best=result2;}}returnbest;}publicstaticintevaluate(int[][]board,booleanturn,intx,inty){intcolor;if(turn)color=1;elsecolor=-1;booleanallSame=true;for(intj=0;j<board[x].length;j++){if(board[x][j]!=color){allSame=false;break;}}if(allSame)returncolor;allSame=true;for(inti=0;i<board.length;i++){if(board[i][y]!=color){allSame=false;break;}}if(allSame)returncolor;if(x!=y&&x!=board.length-1-y){return0;}if(x==y){allSame=true;for(inti=0;i<board.length;i++){if(board[i][i]!=color){allSame=false;break;}}if(allSame)returncolor;}if(x==board.length-1-y){allSame=true;for(inti=0;i<board.length;i++){if(board[i][board.length-i-1]!=color){allSame=false;break;}}if(allSame)returncolor;}return0;}}