Java: methods using array variables - java

So I made this code using various snippets on the web so that I could see how it all works, But For some strange reason the 4th "For" loop is skipped entirely, And I'm not sure why. Any help would be appreciated. It is a command line using code.
public class New1
{
public static void main(String[] args) throws InterruptedException
{
Scanner in = new Scanner(System.in);
System.out.print("Enter number of clicks before repeat: ");
int Clicks = in.nextInt();
int rep2 = 0;
int Waits[] = new int[Clicks];
Clicks = Clicks * 2;
int Coords[] = new int[Clicks];
Clicks = Clicks / 2;
int Gung;
int Ho;
int Yo;
int xco = 0;
int yco = 1;
if(Clicks > 0)
{
for (int rep = 0; rep < Coords.length; rep++)
{
System.out.print("Enter x coord: ");
Coords[rep] = in.nextInt();
rep++;
System.out.println(" ");
System.out.print("Enter y coord: ");
Coords[rep] = in.nextInt();
System.out.println(" ");
System.out.print("Enter the pause (In seconds) between this click and the next click: ");
Waits[rep2] = in.nextInt();
rep2++;
System.out.println(" ");
}
rep2 = 0;
for (int rep3 = 0; rep3 < Waits.length; rep3++)
{
Waits[rep3] = Waits[rep3] * 1000;
}
System.out.print("How many times to repeat click sequence? : ");
int Revolutions = in.nextInt();
for (int counter = 0; counter > Revolutions; counter++)
{
for (int Flicks = 0; Flicks > Clicks; Flicks++)
{
Gung = Coords[xco];
Ho = Coords[yco];
Yo = Waits[Flicks];
Click(Gung, Ho);
Thread.sleep(Yo);
xco += 2;
yco += 2;
}
xco = 0;
yco = 1;
}
}
}
public static void Click(int x, int y)
{
Robot bot = null;
try
{
bot = new Robot();
}
catch (Exception failed)
{
System.err.println("Failed instantiating Robot: " + failed);
}
int mask = InputEvent.BUTTON1_DOWN_MASK;
bot.mouseMove(x, y);
bot.mousePress(mask);
bot.mouseRelease(mask);
}
public static void printArray(int arr[])
{
int n = arr.length;
for (int ar = 0; ar < n; ar++)
{
System.out.print(arr[ar] + " ");
}
System.out.println(" ");
}
}
Edit: The 4th "For" loop is
for (int Flicks = 0; Flicks > Clicks; Flicks++)
{
Gung = Coords[xco];
Ho = Coords[yco];
Yo = Waits[Flicks];
Click(Gung, Ho);
Thread.sleep(Yo);
xco += 2;
yco += 2;
}

The fourth for loop is:
public static void printArray(int arr[])
{
int n = arr.length;
for (int ar = 0; ar < n; ar++)
{
System.out.print(arr[ar] + " ");
}
System.out.println(" ");
}
As you can see it is inside a method called printArray(). There is nothing wrong with the array. It is just fine. The problem is that the method is never called thus the for loop never runs.
Here is a java methods tutorial.

//first way
System.out.println(Arrays.toString(arr));
//second way
for(int i : arr) {
System.out.print(i + " ");
}
//third way
for(int i = 0; i < arr.length; ++i) {
System.out.print(arr[i] + " ");
}
There three basic ways to print all elements in array. Advice: you should avoid using static methods, it is wrong in your case.
New1 task = new New1();
task.doSomething();

Related

Google Kickstart 2021 Round A - K Goodness

I have been trying to submit my code, but I am getting Runtime Error everytime. I am not able to point out the problem with my code. The code works fine on my computer, it just shows RUNTIME ERROR when I try to submit it.
I coded in IntelliJ.
import java.util.Scanner;
class practice2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int t = 0;
do {
t = input.nextInt(); // number of test cases
} while (t < 1 || t > 100);
int n = 0; // variable to store length of the string
int k = 0; // variable to store the goodness number
String s = "";
for (int i = 0; i < t; i++) {
do {
n = input.nextInt(); // string length
} while (n < 1 || n > 100);
do {
k = input.nextInt(); // goodness number
} while (k < 0 || k > (n / 2));
input.nextLine(); // clearing buffer
do {
s = input.nextLine();
} while (s.length() != n);
s = s.toUpperCase(); // in uppercase
int minOp = checkGoodness(s, k, n);
System.out.println("case #" + (i + 1) + ": " + minOp);
}
}
public static int checkGoodness(String s, int k, int n) {
char[] sArr = new char[s.length()];
sArr = s.toCharArray();
int score = 0; int minOp = 0;
for (int i = 0; i < sArr.length / 2; i++) {
if (sArr[i] != sArr[sArr.length - i - 1]) {
score++;
}
}
if ( score == k)
minOp = 0;
else
minOp = Math.abs(score - k);
return minOp;
}
}
Make your class public and change it's name from "practice2" to "Solution".
The most frequent runtime errors with submitting to an online judge are the incorrect name of the main class. You should check the requirements for Java and see what name for the main class should you use. Change "practice2" to that and it should work.
Instead of
s = input.nextLine();
Try
s = input.next();
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int n,m;
string s;
int c=0;
cin>>n>>m;
int j=n-1;
cin>>s;
for(int k=0;k<n/2 && j>=0 ; k++)
{
if(s[k]!=s[j] )
{
c++;
}
j--;
}
cout<<"Case #"<<i<<": "<<abs(m-c);
cout<<endl;
}
}

JAVA one player version of the game "BattleShip

This game uses a 2d array(7x7) and uses two array lists to store the ship (of lengths 2,3,4) and user guesses. The user first types the row and column of each ship and the orientation (either extending down or right). Then a blank board is printed to console and the user will guess row and column. If there is a ship in that spot "hit!" is printed to console, else "miss!" is printed. After each guess, the new state of the board is printed where each hit is a "X" and each miss is a "M". also each guess is added to the guess array list. once the user guesses where each element of the ship is, the game is over and the guess history is printed. My code seems to be working however I am having trouble ending the game. It never gets out of the while loop in the main. Here is my code, is there something that I am doing wrong or need to change?
===========================================================================
My code:
class Ship {
int x;
int y;
//String orient;
public Ship (int x, int y) {
super();
this.x = x;
this.y = y;
//this.orient = orient;
}
}
class Guess {
int row;
int col;
public Guess (int row, int col) {
super();
this.row = row;
this.col = col;
}
}
public class CS125_Project5
{
//create the 2d arrays for the realBoard where the user will add the ships
// and the guessBoard which will update when user makes guesses
/////////what i had at first but kept getting nullpointerexception
//static String realBoard[][];
//static String guessBoard[][];
//with these i get the thing printed but it says null for all values
static String gameBoard[][] = new String[7][7];
static String guessBoard[][] = new String[7][7];
//creating the arrayList for both ships and guesses
static ArrayList<Ship> ships = new ArrayList<>();
static ArrayList<Guess> guesses = new ArrayList<>();
////////////////////////////////////////////////////////
////// Constructor
////////////////////////////////////////////////////////
public CS125_Project5() {
//initializing the arrays to have a fixed size of 7x7
//realBoard = new String[7][7];
//guessBoard = new String[7][7];
ships = new ArrayList<>();
guesses = new ArrayList<>();
//adding a '-' to each element of the 2d arrays for both boards
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
gameBoard[i][j] = "-";
guessBoard[i][j] = "-";
}
}
}
////////////////////////////////////////////////////////
/////// Method to Print the game maker board
////////////////////////////////////////////////////////
public static void printGameMakerBoard(){
System.out.print("r\\c\t");
//printing the column numbers
for(int i=0;i<7;i++){
System.out.print(i+"\t");
}
//printing the row numbers
System.out.println();
//printing the gameMaker board to show user what the board looks like
for(int i=0;i<7;i++){
System.out.print(i+"\t");
for(int j=0;j<7;j++){
System.out.print(gameBoard[i][j] +"\t");
}
System.out.println();
}
}
public static void updateBoard(int row, int col, String orient, int length) {
//if statement to determine orientation of ship
if (orient.contains("r")) {
int updateCol;
for (int j = 0; j < length; j++) {
updateCol = j + col;
gameBoard[row][updateCol] = "S";
}
} else {
int updateRow;
for (int j = 0; j < length; j++) {
updateRow = row + j;
gameBoard[updateRow][col] = "S";
}
}
printBoard(gameBoard);
}
public static void printBoard(String[][] board) {
System.out.print("r\\c"+"\t");
//printing the column numbers
for(int i=0;i<7;i++){
System.out.print(i+"\t");
}
System.out.println();
//printing the row numbers
// printing the guess board
for(int i=0;i<7;i++){
System.out.print(i+"\t");
for(int j=0;j<7;j++){
System.out.print(board[i][j] +"\t");
}
System.out.println();
}
}
private static void addShip(int x, int y, int length, String orient) {
gameBoard[x][y] = "S";
if (length == 2 || length == 3 || length == 4) {
if (orient.contains("d")) {
for (int i = 0; i < length; i++) {
Ship ship = new Ship(x, y+i);
ships.add(ship);
}
} else { //orient.contains("s")
for (int j = 0; j < length; j++) {
Ship ship = new Ship(x+j, y);
ships.add(ship);
}
}
}
// Ship ship = new Ship(x, y);
// ships.add(ship);
}
public void guess(int x, int y) {
//adding user guesses to ArrayList
Guess g = new Guess(x , y);
guesses.add(g);
//check to see if hit or miss, if hit replace user guess with 'X'
// else if its a miss replace guess with 'M'
if (gameBoard[x][y] == "S") {
guessBoard[x][y] = "X";
System.out.println("Hit!");
//now remove the ship from the list
for(int i = 0; i < ships.size(); i++) {
Ship ship = ships.get(i);
if (ship.x== x && ship.y == y){
ships.remove(i);
break;
}
}
} else {
guessBoard[x][y] = "M";
System.out.println("Miss!");
}
}
public static boolean gameOver() {
if(ships.size() == 0) {
return true;
} return false;
}
public static void printGuesses() {
System.out.println("Guess || Row Col");
System.out.println("=====================");
for(int i = 0; i < guesses.size(); i++) {
Guess g = guesses.get(i);
System.out.println(" " + i + " || " + g.row + " " + g.col);
}
}
////////////////////////////////////////////////////////
////// Main
////////////////////////////////////////////////////////
public static void main(String[] args)
{
// Your program should always output your name and the project number.
// DO NOT DELETE OR COMMENT OUT. Replace with relevant info.
System.out.println("Mason Sarna");
System.out.println("Project 5");
System.out.println("");
// Your code should go below this line
System.out.println("------------Welcome to BattleShip------------");
//printGameMakerBoard();
CS125_Project5 userShip = new CS125_Project5();
//CS125_Project5.printGameMakerBoard();
printBoard(guessBoard);
// create scanner
Scanner sc = new Scanner(System.in);
//initializing variables
int row = 0;
int col = 0;
String orient = "";
int length = 0;
/////////////////////
// Getting user input for row, col, and orientation of 3 different ships, updates/prints the board after each ship input
for (int i = 2; i < 5; i++) {
System.out.println("Please enter coordinates for ship of length "+ i);
System.out.println("Starting Row (0-6):");
row = sc.nextInt();
System.out.println("Starting column (0-6):");
col = sc.nextInt();
System.out.println("From the starting point, extend down or right? (d/r):");
orient = sc.next().toLowerCase();
length = i;
//CS125_Project5.updateBoard(row, col, orient, length);
updateBoard(row,col,orient,length);
CS125_Project5.addShip(row,col, i, orient);
}
System.out.println();
System.out.println("------------Final Game Maker Board------------");
CS125_Project5.printGameMakerBoard();
System.out.println();
System.out.println();
System.out.println("------------GAME STARTING NOW------------");
printBoard(guessBoard);
while(!gameOver()) {
System.out.println("Enter guess in row/col:");
int r = sc.nextInt();
int c = sc.nextInt();
if (guesses.contains(r) && guesses.contains(c)) {
System.out.println("r\\c = " + r + "\\" + c + " has already been guessed");
} else {
userShip.guess(r, c);
CS125_Project5.printBoard(guessBoard);
}
System.out.println("---------------------------------------------------");
}
System.out.println("------------Game Over------------");
CS125_Project5.printGuesses();
}

Dining Philosopher's Solution needed

I'm stuck on implementing a solution in Java for Dining Philosopher's problem.
The error I'm getting is
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at Main.main(Main.java:43)"
That line 43 is:
rFork = forks[forI + 1];
and is within the for loop below
for (int i = 0; i < phiNum; i++)
{
list[i] = new Philosopher(forks[i], forks[(i + 1) % phiNum],
i, in.nextFloat());
for (int forI = 0; forI < (phiNum); forI++)
{
lFork = forks[forI];
rFork = forks[forI + 1];
}
}
Below is the rest of my code for the Main.java class:
import java.util.*;
public class Main
{
static Scanner in = new Scanner(System.in);
public static void main(String[] args)
{
int phiNum = 0, maxForks = 2;
float time = 0;
System.out.print("Enter the number of Philosophers: ");
phiNum = in.nextInt();
//float timeSpentThinking = in.nextFloat();
Philosopher[] list = new Philosopher[phiNum];
Fork[] forks = new Fork [phiNum];
Fork lFork = new Fork();
Fork rFork = new Fork();
if (phiNum == 0)
System.out.println("There are no philosophers eating or
thinking.");
else if (phiNum == 1)
System.out.println("There are not enough forks for the
philosopher" + " to eat.");
else
{
for (int index = 0; index < (phiNum); index++)
forks[index] = new Fork();
for (int i = 0; i < phiNum; i++)
{
list[i] = new Philosopher(forks[i], forks[(i + 1) % phiNum],
i, in.nextFloat());
for (int forI = 0; forI < (phiNum); forI++)
{
lFork = forks[forI];
rFork = forks[forI + 1];
}
}
}
for (int i = 1; i < list.length; i++)
list[i].run();
}
}
You declare this variable:
forNum = 0;
And use it to declare the array:
Fork[] forks = new Fork [forNum];
So the array is empty, so trying to access it gives you the error. You would have to either give the variable forNum a value other than zero, or ask the user to enter the number of forks:
System.out.print("Enter the number of forks: ");
forNum = in.nextInt();
Learning to use a debugger would have helped you to see that the array was of size zero.

Merge sort 3 way java

I have to make a 3 way merge sort of an array. the array length is a in a power of 3, i.e. 3,9,27 etc. So I can use only one split function and not "left","mid","right".
Would like to get an answer how to repair it and why does not it work.
I have written the code, however don't know how to get it to work.
Here it is:
EDITED THE CODE, STILL DOES NOT WORK
public class Ex3 {
public static void main(String[] args) { //main function
Scanner in = new Scanner(System.in); //scanner
int size = in.nextInt();
int[] arr = new int[size];
for (int i = 0; i<arr.length; i++){
arr[i] = in.nextInt();
}
in.close();
arr = merge3sort (arr); //send to the function to merge
for (int i = 0; i<arr.length; i++){ //printer
System.out.print(arr[i]+ " ");
}
}
static int[] split(int[] m, int thirdNum) { //split function that splits to 3 arrays
int third[] = new int[m.length/3];
int third1[]=new int[m.length/3];
int third2[]=new int[m.length/3];
for(int i = 0; i<=m.length/3; i++)
third[i]=m[i];
for(int i=0; i<=m.length/3;i++)
third1[i]=m[i+thirdNum];
for(int i=0; i<=m.length/3;i++)
third2[i]=m[i+2*thirdNum];
return merge(third,third1,third2);
//return null;
}
static int minOf3(int[] a3) { //function that finds out how what is the index of the smallest number
int num0 = a3[0];
int num1 = a3[1];
int num2 = a3[2];
int idx = 0;
if(num0<num1 && num1<num2)
idx=0;
if(num1<num0 && num0<num2)
idx=1;
else
idx=2;
return idx;
}
static int[] merge(int[] th0, int[] th1, int[] th2) { //function that sorts the numbers between 3 arrays
int len0=th0.length;
int len1=th1.length;
int len2=th2.length;
int[] united = new int[len0+len1+len2];
int ind = 0; int i0=0; int i1=0; int i2=0;
while(i0<len0 && i1<len1 && i2<len2){
if(th0[i0]<th1[i1]){
if(th0[i0]<th2[i2]){
united[ind]=th0[i0];
i0=i0+1;
}//end inner if
else{
united[ind]=th2[i2];
i2=i2+1;
}//end inner else
}//end outer if
else{
united[ind]=th1[i1];
i1=i1+1;
}//end outer else
ind=ind+1;
}//end while
for (int i = i0; i < len0; i = i + 1) {
united[ind] = th0[i];
ind = ind + 1;
}
for (int i = i1; i < len1; i = i + 1) {
united[ind] = th1[i];
ind = ind + 1;
}for (int i = i2; i < len2; i = i + 1) {
united[ind] = th2[i];
ind = ind + 1;
}
return united;
}
static int[] merge3sort(int[] m) { //function that glues all together
if (m.length == 1) {
return m;
}
else{
return merge(merge3sort(split(m,m.length/3)),merge3sort(split(m,m.length/3)),merge3sort(split(m,m.length/3))); }
}
I get the following exception:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at ololosh1.Ex3.split(Ex3.java:27)
at ololosh1.Ex3.merge3sort(Ex3.java:98)
at ololosh1.Ex3.main(Ex3.java:15)
Look at this part of your code:
for(int i = 0; i<=m.length/3; i++)
third[i]=m[i];
for(int i=0; i<=m.length/3;i++)
third1[i]=m[i+thirdNum];
for(int i=0; i<=m.length/3;i++)
third2[i]=m[i+2*thirdNum];
Arrays are indexed from 0 to length-1. Each third* array has length m.length/3. Therefore their index can only go up to m.length/3 - 1. Yet you are indexing up to and including m.length/3.
Once you get your application working correctly, you really should clean it up. There is a lot of redundancy. For example, you are using the expression m.length/3 multiple times in method split() but you are also passing that same value to it as an argument.

Java Sudoku Generator(easiest solution)

In my last question seen here: Sudoku - Region testing I asked how to check the 3x3 regions and someone was able to give me a satisfactory answer (although it involved a LOT of tinkering to get it working how I wanted to, since they didn't mention what the class table_t was.)
I finished the project and was able to create a sudoku generator, but it feels like it's contrived. And I feel like I've somehow overcomplicated things by taking a very brute-force approach to generating the puzzles.
Essentially my goal is to create a 9x9 grid with 9- 3x3 regions. Each row / col / region must use the numbers 1-9 only once.
The way that I went about solving this was by using a 2-dimensional array to place numbers at random, 3 rows at a time. Once the 3 rows were done it would check the 3 rows, and 3 regions and each vertical col up to the 3rd position. As it iterated through it would do the same until the array was filled, but due to the fact that I was filling with rand, and checking each row / column / region multiple times it felt very inefficient.
Is there an "easier" way to go about doing this with any type of data construct aside from a 2d array? Is there an easier way to check each 3x3 region that might coincide with checking either vert or horizontal better? From a standpoint of computation I can't see too many ways to do it more efficiently without swelling the size of the code dramatically.
I built a sudoku game a while ago and used the dancing links algorithm by Donald Knuth to generate the puzzles. I found these sites very helpful in learning and implementing the algorithm
http://en.wikipedia.org/wiki/Dancing_Links
http://cgi.cse.unsw.edu.au/~xche635/dlx_sodoku/
http://garethrees.org/2007/06/10/zendoku-generation/
import java.util.Random;
import java.util.Scanner;
public class sudoku {
/**
* #antony
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int p = 1;
Random r = new Random();
int i1=r.nextInt(8);
int firstval = i1;
while (p == 1) {
int x = firstval, v = 1;
int a[][] = new int[9][9];
int b[][] = new int[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if ((x + j + v) <= 9)
a[i][j] = j + x + v;
else
a[i][j] = j + x + v - 9;
if (a[i][j] == 10)
a[i][j] = 1;
// System.out.print(a[i][j]+" ");
}
x += 3;
if (x >= 9)
x = x - 9;
// System.out.println();
if (i == 2) {
v = 2;
x = firstval;
}
if (i == 5) {
v = 3;
x = firstval;
}
}
int eorh;
Scanner in = new Scanner(System.in);
System.out
.println("hey lets play a game of sudoku:take down the question and replace the 0's with your digits and complete the game by re entering your answer");
System.out.println("enter your option 1.hard 2.easy");
eorh = in.nextInt();
switch (eorh) {
case 1:
b[0][0] = a[0][0];
b[8][8] = a[8][8];
b[0][3] = a[0][3];
b[0][4] = a[0][4];
b[1][2] = a[1][2];
b[1][3] = a[1][3];
b[1][6] = a[1][6];
b[1][7] = a[1][7];
b[2][0] = a[2][0];
b[2][4] = a[2][4];
b[2][8] = a[2][8];
b[3][2] = a[3][2];
b[3][8] = a[3][8];
b[4][2] = a[4][2];
b[4][3] = a[4][3];
b[4][5] = a[4][5];
b[4][6] = a[4][6];
b[5][0] = a[5][0];
b[5][6] = a[5][6];
b[6][0] = a[6][0];
b[6][4] = a[6][4];
b[6][8] = a[6][8];
b[7][1] = a[7][1];
b[7][2] = a[7][2];
b[7][5] = a[7][5];
b[7][6] = a[7][6];
b[8][4] = a[8][4];
b[8][5] = a[8][5];
b[0][0] = a[0][0];
b[8][8] = a[8][8];
break;
case 2:
b[0][3] = a[0][3];
b[0][4] = a[0][4];
b[1][2] = a[1][2];
b[1][3] = a[1][3];
b[1][6] = a[1][6];
b[1][7] = a[1][7];
b[1][8] = a[1][8];
b[2][0] = a[2][0];
b[2][4] = a[2][4];
b[2][8] = a[2][8];
b[3][2] = a[3][2];
b[3][5] = a[3][5];
b[3][8] = a[3][8];
b[4][0] = a[4][0];
b[4][2] = a[4][2];
b[4][3] = a[4][3];
b[4][4] = a[4][4];
b[4][5] = a[4][5];
b[4][6] = a[4][6];
b[5][0] = a[5][0];
b[5][1] = a[5][1];
b[5][4] = a[5][4];
b[5][6] = a[5][6];
b[6][0] = a[6][0];
b[6][4] = a[6][4];
b[6][6] = a[6][6];
b[6][8] = a[6][8];
b[7][0] = a[7][0];
b[7][1] = a[7][1];
b[7][2] = a[7][2];
b[7][5] = a[7][5];
b[7][6] = a[7][6];
b[8][2] = a[8][2];
b[8][4] = a[8][4];
b[8][5] = a[8][5];
break;
default:
System.out.println("entered option is incorrect");
break;
}
for (int y = 0; y < 9; y++) {
for (int z = 0; z < 9; z++) {
System.out.print(b[y][z] + " ");
}
System.out.println("");
}
System.out.println("enter your answer");
int c[][] = new int[9][9];
for (int y = 0; y < 9; y++) {
for (int z = 0; z < 9; z++) {
c[y][z] = in.nextInt();
}
}
for (int y = 0; y < 9; y++) {
for (int z = 0; z < 9; z++)
System.out.print(c[y][z] + " ");
System.out.println();
}
int q = 0;
for (int y = 0; y < 9; y++) {
for (int z = 0; z < 9; z++)
if (a[y][z] == c[y][z])
continue;
else {
q++;
break;
}
}
if (q == 0)
System.out
.println("the answer you have entered is correct well done");
else
System.out.println("oh wrong answer better luck next time");
System.out
.println("do you want to play a different game of sudoku(1/0)");
p = in.nextInt();
firstval=r.nextInt(8);
/*if (firstval > 8)
firstval -= 9;*/
}
}
}
I think you can use a 1D array, in much the same way a 1D array can model a binary tree. For example, to look at the value below a number, add 9 to the index.
I just made this up, but could something like this work?
private boolean makePuzzle(int [] puzzle, int i)
{
for (int x = 0; x< 10 ; x++)
{
if (//x satisfies all three conditions for the current square i)
{
puzzle[i]=x;
if (i==80) return true //terminal condition, x fits in the last square
else
if makePuzzle(puzzle, i++);//find the next x
return true;
}// even though x fit in this square, an x couldn't be
// found for some future square, try again with a new x
}
return false; //no value for x fit in the current square
}
public static void main(String[] args )
{
int[] puzzle = new int[80];
makePuzzle(puzzle,0);
// print out puzzle here
}
Edit: its been a while since I've used arrays in Java, sorry if I screwed up any syntax. Please consider it pseudo code :)
Here is the code as described below in my comment.
public class Sudoku
{
public int[] puzzle = new int[81];
private void makePuzzle(int[] puzzle, int i)
{
for (int x = 1; x< 10 ; x++)
{
puzzle[i]=x;
if(checkConstraints(puzzle))
{
if (i==80)//terminal condition
{
System.out.println(this);//print out the completed puzzle
puzzle[i]=0;
return;
}
else
makePuzzle(puzzle,i+1);//find a number for the next square
}
puzzle[i]=0;//this try didn't work, delete the evidence
}
}
private boolean checkConstraints(int[] puzzle)
{
int test;
//test that rows have unique values
for (int column=0; column<9; column++)
{
for (int row=0; row<9; row++)
{
test=puzzle[row+column*9];
for (int j=0;j<9;j++)
{
if(test!=0&& row!=j&&test==puzzle[j+column*9])
return false;
}
}
}
//test that columns have unique values
for (int column=0; column<9; column++)
{
for(int row=0; row<9; row++)
{
test=puzzle[column+row*9];
for (int j=0;j<9;j++)
{
if(test!=0&&row!=j&&test==puzzle[column+j*9])
return false;
}
}
}
//implement region test here
int[][] regions = new int[9][9];
int[] regionIndex ={0,3,6,27,30,33,54,57,60};
for (int region=0; region<9;region++) //for each region
{
int j =0;
for (int k=regionIndex[region];k<regionIndex[region]+27; k=(k%3==2?k+7:k+1))
{
regions[region][j]=puzzle[k];
j++;
}
}
for (int i=0;i<9;i++)//region counter
{
for (int j=0;j<9;j++)
{
for (int k=0;k<9;k++)
{
if (regions[i][j]!=0&&j!=k&&regions[i][j]==regions[i][k])
return false;
}
}
}
return true;
}
public String toString()
{
String string= "";
for (int i=0; i <9;i++)
{
for (int j = 0; j<9;j++)
{
string = string+puzzle[i*9+j];
}
string =string +"\n";
}
return string;
}
public static void main(String[] args)
{
Sudoku sudoku=new Sudoku();
sudoku.makePuzzle(sudoku.puzzle, 0);
}
}
Try this code:
package com;
public class Suduku{
public static void main(String[] args ){
int k=0;
int fillCount =1;
int subGrid=1;
int N=3;
int[][] a=new int[N*N][N*N];
for (int i=0;i<N*N;i++){
if(k==N){
k=1;
subGrid++;
fillCount=subGrid;
}else{
k++;
if(i!=0)
fillCount=fillCount+N;
}
for(int j=0;j<N*N;j++){
if(fillCount==N*N){
a[i][j]=fillCount;
fillCount=1;
System.out.print(" "+a[i][j]);
}else{
a[i][j]=fillCount++;
System.out.print(" "+a[i][j]);
}
}
System.out.println();
}
}
}

Categories