九連環 C語言遞迴程式碼
阿新 • • 發佈:2019-01-24
兩年前玩九連環時候寫的,想清一下硬碟刪些東西。
實際上九連環的裝和卸都是遞迴操作:
1.第一個環可以自由裝/卸
2.第i(i>1&&i<10)個環需要第i-1個環的輔助才能完成裝/卸,且需要第1個到第i-2個環均處於已拆卸狀態。
假如現在想卸下第7個環,那麼需要保證第六個環處於未拆卸狀態,並且需要已經卸下了第1到第5個環,然後用第6個環卸下第7環。之後你會發現:咦TMD第6個怎麼沒卸下來。想卸下第6個又需要裝上第5個,再保證第1個到第4個環已拆卸。。。
C程式碼:
int shangmian[10];//環的狀態,1表示未拆卸 int step = 0; void zhuang(int n); void xie(int n) { if (n == 1) { printf("第%d步:卸掉--> %d\n", step++, n);shangmian[n] = 0; return; } if (shangmian[n - 1] == 0) { zhuang(n - 1); } for (int i = n - 2; i >= 1; i--) { if (shangmian[i] == 1) { xie(i); } } printf("第%d步:卸掉--> %d\n", step++, n); shangmian[n] = 0; return; } void zhuang(int n) { if (n == 1) { printf("第%d步:裝上--> %d\n", step++, n);shangmian[n] = 1; return; } if (shangmian[n - 1] == 0) { zhuang(n - 1); } for (int i = n - 2; i >= 1; i--) { if (shangmian[i] == 1) { xie(i); } } printf("第%d步:裝上--> %d\n", step++, n);shangmian[n] = 1; return; } int _tmain(int argc, TCHAR *argv[], TCHAR *env[]) { for (int i = 0; i < 10; i++) { shangmian[i] = 1; } for (int i = 9; i >= 1; i--) { xie(i); } //xie(8); system("pause"); return 0; }