中國象棋馬走日 — 遞歸


 

 1 //在半個中國象棋棋盤上,馬在左下角(11)處,馬走日字,
 2 //而且只能往右走...不能向左...可上可下...求從起點到(m, n)處有
 3 //幾種不同的走法(函數的遞歸調用)
 4 
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 
 8 int horse(int x1,int y1,int x2,int y2);
 9 int main()
10 {
11     char ch;
12     while(ch != EOF)
13     {
14         int m,n;
15         printf("請輸入目的地址,用英文逗號隔開,如2,3:\n");
16         if(scanf("%d,%d",&m,&n) < 2)
17             printf("輸入有不全,請重新輸入!\n");
18         else if(m>9||m<1||n>5||n<1)
19                 printf("輸入有誤,請重新輸入!\n");
20             else
21                 printf("結果為:%d",horse(1,1,m,n));
22         printf("\n輸入ctrl+z退出,任意鍵繼續\n");
23         getchar();
24         ch = getchar();
25         system("cls");
26     }
27     return 0;
28 }
29 
30 //走馬的實現
31 int horse(int x1,int y1,int x2,int y2)
32 {
33     //在這個算法中,目的地不變,在變的一直是起點,遞歸有兩個出口,一個返回0(表示找不到),一個返回1(表示找到)。
34     int result = 0;
35     if( x1 > x2 || x1==x2 && y1 != y2)     //x1 > x2 表示已經往左邊走,
36         return 0;                        //x1==x2 && y1 != y2 表示已在同一豎線上,但橫線不重合,注定走不到一起。
37     else if(x1==x2 && y1==y2)
38         return 1;
39     else
40     {
41         //每一個點有“四種”走法,每一個起點都遞歸調用。
42         //注意到x1只能 + ,因為只能往右走。
43         if(x1+2<=9 && y1+1<=5)
44             result += horse(x1+2,y1+1,x2,y2);
45         if(x1+1<=9 && y1+2<=5)
46             result += horse(x1+1,y1+2,x2,y2);
47         if(x1+2<=9 && y1-1>=1)
48             result += horse(x1+2,y1-1,x2,y2);
49         if(x1+1<=9 && y1-2>=1)
50             result += horse(x1+1,y1-2,x2,y2);
51         //所有遞歸調用回溯之后,得到一個總的result,即步數。
52         return result;
53     }
54 }

 


免責聲明!

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



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