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 }