C	Fortran Example-3
C	Magic square Partial solution					Fall 2005
	PROGRAM MAGIC$SQUARE
	IMPLICIT INTEGER (A-Z)
	COMMON TABLE(300,9),Many,COUNT,LIGHT(3,3),ANSWER(3,3,9)
	Logical More
	MORE= .true.
	InputCount=0
	DO WHILE (MORE)
	  READ(88,7777,END=1000) LIGHT
 7777	  Format (9I1)
	  InputCount=InputCount+1
	  PRINT 444
 444	  FORMAT(1H1)
	  PRINT 999,     InputCount, ((LIGHT(R,C), C=1,3), R=1,3)
	  Write (55,999) InputCount, ((Light(R,C), C=1,3), R=1,3)
 999	  FORMAT(//' INPUT LIGHT PATTERN NUMBER:' I4//(3I4))
	  DO 50 Many=1,9  ! LOOP TO TAKE ONE SET OF BUTTON COMBINATIONS
	  CALL COMBINATIONS
	  CALL TEST (Solve)
	  IF (Solve .GT. 0) THEN ! THEN A SOLUTION COMBINATION IS FOUND
	    write(55,4444) Many
	    print 4444, Many
 4444	    Format (/' THE NUMBER OF BUTTONS PRESSED:', I3/)
	    DO 550 PLANE=1, Many
	    PRINT 888,    TABLE (SOLVE,PLANE)
	    Write(55,888) Table (Solve,Plane)
 888	    FORMAT(/ 4X,'BUTTON PUSHED'/ 8X, I2/)
	      DO 66 C=1,3
  	      PRINT 777,     (ANSWER(C,R,PLANE), R=1,3)
  66	      Write (55,777) (Answer(C,R,Plane), R=1,3)
 777	    FORMAT( 1X,3I4)
 550	    CONTINUE
	    exit
	    ENDIF ! END OF "Solve > 0"
  50	  CONTINUE !ELSE, CONTINUE THE LOOP TO GET NEXT SET OF
*                  !BUTTON COMBINATIONS
 500	END DO     !END OF "DO WHILE" LOOp
 1000	Continue
	End Program	! End of main program
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
C	SUBROUTINE TEST (Solve)
C	THIS SUBROUTINE, GIVEN TABLE(300,9),MANY,COUNT, AND LIGHT,
C	DOES THE FOLLOWING:
C	1. CHECK COMBINATIONS OF BUTTONS (IN TABLE) TO SEE
C          IF A COMBINATION IS THE SOLUTION TO FORMING THE MAGIC SQUARE.
C	2. IF SUCH A COMBINATION IS FOUND, THEN SUBROUTINE WILL SET
C	      SOLVE = THE ROW OF "TABLE" CONTAINING THE COMBINATION
C	      AND "ANSWERS" WILL CONTAIN ALL RESULTING LIGHT PATTERNS.
C	3. IF NO COMBINATION IS THE SOLUTION, THEN
C	      Solve=0
C	      RETURN.
C ********************************************************************
	SUBROUTINE  TEST (Solve)
	IMPLICIT INTEGER (A-Z)
	COMMON TABLE(300,9),MANY,COUNT,LIGHT(3,3),ANSWER(3,3,9)
	INTEGER SWITCH(6,9)/ 4,1,2,4,5,0,  3,1,2,3,0,0,
	1                    4,2,3,5,6,0,  3,1,4,7,0,0,
	2                    5,2,4,5,6,8,  3,3,6,9,0,0,
	3                    4,4,5,7,8,0,  3,7,8,9,0,0,
	4                    4,5,6,8,9,0 /
	INTEGER GOAL(9) /4*1,0,4*1/
	INTEGER SAVE(3,3), SAVE2(9)
	! The rest is for you to figure out
********************************************************
  	SUBROUTINE COMBINATIONS
	IMPLICIT INTEGER (A-Z)
	INTEGER COMB(300,9)
	COMMON COMB,MANY,COUNT,SOLVE,YES,LIGHT(3,3), ANSWER(3,3,9)
	Logical More
	COUNT=1
	DO 100 M=1 , MANY
 100	COMB(COUNT,M)=M !THE FIRST COMBINATION: 1,2,3,...,MANY
C SET UP AN INFINITE LOOP IN WHICH TO PICK UP THE NEXT COMBINATION
C
	MORE=.true.
	DO WHILE (MORE)
	  More=.false.
	  DO 200 M=MANY,1,-1
	    IF (COMB(COUNT,M) .LT. 9-MANY+M) then
	      More=.true.
	      exit
	      end if
 200	    CONTINUE
	    ! ELSE, THE LAST COMBINATION CALCULATED IS THE LAST POSSIBLE ONE:
	  IF (MORE) THEN
	    COUNT=COUNT+1
	    DO 500 N=1, M-1
 500	      COMB(COUNT,N)=COMB(COUNT-1,N)
	      KEEP=COMB(COUNT-1,M)
	    DO 600 N=M,MANY
	      KEEP=KEEP+1
 600	      COMB(COUNT,N) = KEEP
	    END IF ! END OF IF (MORE) !!!!!!!!!!!!!!!
	  END DO ! END OF THE INFINITE LOOP  !!!!!!!!!!!!!
	RETURN
	END