5*5棋盤馬走日將棋盤走滿
阿新 • • 發佈:2018-11-14
# include<stdio.h> # include<math.h> # define N 25 int a[N]={1},sum=0,b[N]={1};//a[]儲存橫座標,b[]儲存縱座標 void show(){ int i; for(i=0;i<N;i++) printf("[%d,%d]",i+1,(int)sqrt(N)*(b[i]-1)+a[i]); } int check(int n){ //檢查第n步是否合法 int i; if((abs(a[n]-a[n-1])==1&&abs(b[n]-b[n-1])==2)||(abs(a[n]-a[n-1])==2&&abs(b[n]-b[n-1])==1)){ for(i=0;i<n;i++){ if(a[n]==a[i]&&b[n]==b[i]) return 0;//不滿足不能重複,不合法 } return 1; //合法 } else return 0;//不滿足走日規則,不合法 } void put(int n){ //放置第n步 int i,j; for(i=1;i<=(int)sqrt(N);i++){ a[n]=i; for(j=1;j<=sqrt(N);j++){ b[n]=j; if(check(n)){ if(n==N-1) { sum++;//統計解的個數 if(sum==1) show();}//列印第一組解 else put(n+1);//否則,走下一步 } } } } int main(){ put(1); printf("\n共有解:"); printf("%d\n",sum); return 0; }