r為矩陣的行,c為矩陣的列
將結果輸出到當前目錄下的results.txt。
結果將給出:1.是否存在路徑使馬可以按要求走遍所有的方格;
2.解的總數;
3.程序執行的時間;
#include<stdio.h> #include <stdlib.h> #include <time.h> #define r 2 #define c 4 int flag[r][c]={0};//存放馬跳路徑的二維數組 int arr[r][c]={0}; int x[8]={2,1,-1,-2,2,1,-1,-2}; int y[8]={1,2,2,1,-1,-2,-2,-1}; int n=1,count; FILE *fp; //初始化文件輸出流 int initOut() { fp=fopen("results.txt","w"); //記得關閉 if(fp==NULL) { printf("File cannot open! " ); exit(0); } return 0; } //添加一個判斷函數,判斷這樣的哈密頓路徑是否存在 void judgeExistence(){ if(count==0) printf("%d * %d 的棋盤不存在能使得馬可以不重復遍歷完棋盤中每一格的路徑\n",r,c); } //輸出馬跳的步驟stepOut() void stepOut(){ for(int a=0;a<r;a++){ for(int b=0;b<c;b++) { fprintf(fp,"%3d ",arr[a][b]); } fprintf(fp,"\n"); } fprintf(fp,"\n"); } void DFS(int i,int j) { if(n==r*c) { count++; stepOut();//寫個函數,輸出馬跳的步驟stepOut() } else for(int k=0;k<8;k++) { if(i+x[k]>=0&&i+x[k]<r&&j+y[k]>=0&&j+y[k]<c&&flag[i+x[k]][j+y[k]]==0) { flag[i+x[k]][j+y[k]]=1;n++; arr[i+x[k]][j+y[k]]=n;//給記錄馬跳步驟的矩陣賦值 DFS(i+x[k],j+y[k]);//循環+遞歸 flag[i+x[k]][j+y[k]]=0;n--; } } } void main() { clock_t start, finish; //計算程序一共花費了多少時間 long duration; start=clock(); count=0; int X,Y; label_1:printf("請輸入馬初始橫坐標(X<=%d):X=\n",r); scanf("%d",&X); if(X>r){ printf("請輸入小於等於%d的數\n",r); goto label_1; } label_2:printf("請輸入馬初始縱坐標(Y<=%d):Y=\n",c); scanf("%d",&Y); if(Y>c){ printf("請輸入小於等於%d的數\n",c); goto label_2; } X=X-1; Y=Y-1; flag[X][Y]=1; arr[X][Y]=1; initOut(); DFS(X,Y); judgeExistence(); fprintf(fp,"解的總數為:%d\n",count); finish=clock(); duration=finish-start;//程序執行的時間,單位毫秒 fprintf(fp,"程序執行的時間為:%10ld ms\n",duration); fclose(fp); }
代碼中有哪些不正確的地方歡迎大家指正。
