import java.awt.*; import java.util.*; import javax.swing.JButton; /** * @author rpj * @version 14iii09 * */ public class PartialSquare { // size and numCells need to be static so the extensions know the dimensions private static int size; // size of magic square. private static int numCells; // number of cells in magic square (size*size) private Vector myNums; public PartialSquare(int theSize) { // create an empty partial square size = theSize; numCells = size * size; myNums = new Vector(); } private PartialSquare(Vector itsNums) { // create a partial square from an existing vector // Note: this constructor cannot be called from outside! myNums = new Vector(); for (int i:itsNums) extend(i); } public Vector successors() { Vector retValue = new Vector(); if (myNums.size() != numCells) { // generate all the successors PartialSquare aCandidate; for (int i=1; i(myNums)).size() < myNums.size()) return false; int firstRowSum = 0; for (int i = 0; i < size; i++) firstRowSum += myNums.elementAt(i); // check other rows int sum; for (int row = 1; row < size; row++) { sum = 0; for (int i = size*row; i < size*(row+1); i++) sum += myNums.elementAt(i); if (sum != firstRowSum) return false; } // check columns for (int col = 0; col < size; col++) { sum = 0; for (int i = col; i < numCells; i+= size) sum += myNums.elementAt(i); if (sum != firstRowSum) return false; } // check topleft-bottomright diagonal sum = 0; for (int i = 0; i < numCells; i += size+1) sum += myNums.elementAt(i); if (sum != firstRowSum) return false; // check other diagonal sum = 0; for (int i = size-1; i < numCells-size+1; i += size-1) sum += myNums.elementAt(i); if (sum != firstRowSum) return false; // all tests passed, so return true; } private void extend(int i) { // Note private! myNums.add(i); } public Vector getNums() { // so the caller can display me return myNums; } }