中國象棋馬走日(要求打印每一種走法) — 遞歸


 1 //在半個中國象棋棋盤上,馬在左下角(1,1)處,馬走日字,
 2 //而且只能往右走...不能向左...可上可下...求從起點到(m, n)處有
 3 //幾種不同的走法(函數的遞歸調用)
 4 //要求打印出每一種走法
 5 
 6 
 7 #include<stdio.h>
 8 #include<stdlib.h>
 9 
10 int counter = 0;
11 //一個點的結構
12 typedef struct Point
13 {
14     int x;
15     int y;
16 }Point;
17 
18 //定義一個結構體保存路徑
19 typedef struct Step
20 {
21     int num;
22     Point steps[9];
23 }Step;
24 //聲明一個路徑結構體全局變量,並初始化
25 Step trace = {-1,{1,1}};
26 
27 
28 //聲明函數
29 void print();
30 int horse(int x1,int y1,int x2,int y2);
31 
32 int main()
33 {
34     char ch;
35     while(ch != EOF)
36     {
37         int m,n;
38         counter = 0;
39         printf("請輸入目的地址,用英文逗號隔開,如2,3:\n");
40         if(scanf("%d,%d",&m,&n) < 2)
41             printf("輸入有不全,請重新輸入!\n");
42         else if(m>9||m<1||n>5||n<1)
43                 printf("輸入有誤,請重新輸入!\n");
44             else
45                 printf("共有%d種走法\n",horse(1,1,m,n));
46         printf("\n輸入ctrl+z退出,任意鍵繼續\n");
47         getchar();
48         ch = getchar();
49         system("cls");
50     }
51     return 0;
52 }
53 
54 int horse(int x1,int y1,int x2,int y2)
55 {
56     int result = 0;
57     //創建並添加該點
58     Point po = {x1,y1};
59     trace.steps[++trace.num] = po;
60     if(x2 < x1  || (x1==x2 && y1 != y2))
61     {
62         trace.num--;    //返回前,去除該點
63         return 0;
64     }
65     
66     if(x1 == x2 && y1 == y2)
67     {
68         counter++;
69         print();
70         trace.num--;    //返回前,去除該點
71         return 1;
72     }
73     
74     if(x1+1 <= 9 && y1+2 <= 5)
75         result+=horse(x1+1,y1+2,x2,y2);
76     if(x1+1 <= 9 && y1-2 >0)
77         result+=horse(x1+1,y1-2,x2,y2);
78     if(x1+2 <= 9 && y1+1 <= 5)
79         result+=horse(x1+2,y1+1,x2,y2);
80     if(x1+2 <= 9 && y1-1 > 0)
81         result+=horse(x1+2,y1-1,x2,y2);
82 
83     trace.num--;        //返回前,去除該點
84     return result;
85 }
86 
87 void print()
88 {
89     int i;
90     printf("第%d種走法為:",counter);
91     for(i = 0;i <= trace.num;i++)
92     {
93         printf("[%d,%d] ",trace.steps[i].x,trace.steps[i].y);
94     }
95     printf("\n");
96 }

 


免責聲明!

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



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