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