Search code examples
algorithmdynamic-programminggraph-algorithmpuzzlesliding-tile-puzzle

Arrange eight consecutive number in a matrix so that no two number are adjacent


Need to number 1 to 8 in following diagram such that no two number in neighbor cell are consecutive to each other Pattern :

     *
    ***
    ***
     *

Where each * contain a number between 1 to 8 and no two neighbor * are consucutive number.


Solution

  • Assuming neighbours horizontally and vertically (not diagonally), a greedy solution would be to reshuffle till you find a solution. Your array is small enough, thus you would need a bit more than 24 retries on average to find a match.

    import java.util.Random;
    
    public class EightPattern {
        private static Random rnd = new Random();
    
        /*
         * -0-
         * 123
         * 456
         * -7-
         */
        private static boolean isOK(int[] array) {
            if (       Math.abs(array[0] - array[2]) == 1
                    || Math.abs(array[1] - array[2]) == 1
                    || Math.abs(array[2] - array[3]) == 1
                    || Math.abs(array[1] - array[4]) == 1
                    || Math.abs(array[2] - array[5]) == 1
                    || Math.abs(array[3] - array[6]) == 1
                    || Math.abs(array[4] - array[5]) == 1
                    || Math.abs(array[5] - array[6]) == 1
                    || Math.abs(array[5] - array[7]) == 1) {
                return false;
            }
            return true;
        }
    
        //shuffle until you find an isOK solution
        public static void patternShuffle(int[] array) {
            do {
                shuffleArray(array);
            }while(!isOK(array));
        }
    
    
        //Fisher–Yates shuffle
        static void shuffleArray(int[] ar) {
            for (int i = ar.length - 1; i > 0; i--) {
                int index = rnd.nextInt(i + 1);
                int a = ar[index];
                ar[index] = ar[i];
                ar[i] = a;
            }
        }
    
        private static void printPattern(int[] array) {
            System.out.println(" " + array[0]);
            System.out.println("" + array[1] + array[2] + array[3]);
            System.out.println("" + array[4] + array[5] + array[6]);
            System.out.println(" " + array[7]);
        }
    
        public static void main(String args[]) {
            int[] a = new int[]{1,2,3,4,5,6,7,8};
            patternShuffle(a);
            printPattern(a);
        }   
    }