馬踏棋盤算法遞歸+回溯法實現 C語言


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); 
    }

代碼中有哪些不正確的地方歡迎大家指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM