两个老外婆过河,函数递归解法

来源:互联网 发布:网络推广的含义 编辑:程序博客网 时间:2024/05/17 01:15
#include<stdio.h>#include<stdlib.h>char start[7] ={'a','a','a','0','b','b','b'};char end[7]   ={'b','b','b','0','a','a','a'};char stack[1000][7];char stack_top=0;void debug_stack(){int index;for(index=stack_top-1;index>=0;index--){printf("%c %c %c %c %c %c %c   ---> %d\n",stack[index][0],stack[index][1],stack[index][2],stack[index][3],stack[index][4],stack[index][5],stack[index][6],index);}printf("-----------------------------\n");}int step(char *pos){int i,ret;char tmp;char array[7];memcpy(array,pos,7);for(i=0;i<6;i++)//a向右走一步{if((array[i]=='a')&&(array[i+1]=='0')){tmp        = array[i];array[i]   = array[i+1];array[i+1] = tmp;memcpy(stack[stack_top],array,7);stack_top++;step(stack[stack_top-1]);break;}}memcpy(array,pos,7);for(i=0;i<5;i++)//a向右跳一步{if((array[i]=='a')&&(array[i+2]=='0')){tmp        = array[i];array[i]   = array[i+2];array[i+2] = tmp;memcpy(stack[stack_top],array,7);stack_top++;step(stack[stack_top-1]);break;}}memcpy(array,pos,7);for(i=6;i>=1;i--)//b向左走一步{if((array[i]=='b')&&(array[i-1]=='0')){tmp        = array[i];array[i]   = array[i-1];array[i-1] = tmp;memcpy(stack[stack_top],array,7);stack_top++;step(stack[stack_top-1]);break;}}memcpy(array,pos,7);for(i=6;i>=2;i--)//b向右跳一步{if((array[i]=='b')&&(array[i-2]=='0')){tmp        = array[i];array[i]   = array[i-2];array[i-2] = tmp;memcpy(stack[stack_top],array,7);stack_top++;step(stack[stack_top-1]);break;}}if(memcmp(end,array,7)==0){ret = 2;printf("bingo....\n");debug_stack();}if(memcmp(pos,array,7)==0){ret = 1;}else{ret = 0;}stack_top--;return ret;}int main(int argc,char **argv){printf("'a' is red  The old grandmother\n");printf("'b' is blue The old grandmother\n");printf("'0' is The blank stone.....\n");printf("the stard postion is: %c %c %c %c %c %c %c\n",start[0],start[1],start[2],start[3],start[4],start[5],start[6]);printf("the end   postion is: %c %c %c %c %c %c %c\n",end[0],end[1],end[2],end[3],end[4],end[5],end[6]);step(start);}
/*
a:向右直走一步
a:向右跳一步
b:向左直走一步
b:向左跳一步
仅有这四种走法,逐步递归下去,一定能找到两种走法,因为对称!
*/
0 0