藍橋杯:歷年試題PREV-42— 九宮幻方
阿新 • • 發佈:2018-12-18
今天訓練的一道題。。明擺著的DFS在機房將近一個小時才寫出來,還給寫錯了……(吐血),讓大一大二同學見笑了。。233333333
#include<stdio.h> #include<stdlib.h> int sum; int ans[4][4]={0},matrix[4][4]={0},book[10]={0}; int check(void) { int i,j; for(i=1;i<=3;i++) if(matrix[i][1]+matrix[i][2]+matrix[i][3]!=15) return 0; for(j=1;j<=3;j++) if(matrix[1][j]+matrix[2][j]+matrix[3][j]!=15) return 0; if(matrix[1][1]+matrix[2][2]+matrix[3][3]!=15) return 0; if(matrix[1][3]+matrix[2][2]+matrix[3][1]!=15) return 0; return 1; } void DFS(int sp) { int i,j; if(sp>9) { if(check()) { sum++; for(i=1;i<=3;i++) for(j=1;j<=3;j++) ans[i][j]=matrix[i][j]; } return; } int si=(sp+2)/3,sj=sp%3; if(!sj) sj=3; if(matrix[si][sj]) { DFS(sp+1); return; } for(i=1;i<=9;i++) { if(book[i]) continue; book[i]=1; matrix[si][sj]=i; DFS(sp+1); matrix[si][sj]=0; book[i]=0; } return; } int main(int argc, char *argv[]) { int i,j; for(i=1;i<=3;i++) { for(j=1;j<=3;j++) { scanf("%d",&matrix[i][j]); book[matrix[i][j]]=1; } } matrix[2][2]=5; sum=0; DFS(1); if(sum==1) { for(i=1;i<=3;i++) for(j=1;j<=3;j++) printf("%d%c",ans[i][j],j==3?'\n':' '); } else if(sum>1) printf("Too Many\n"); return 0; }