![]() ![]() |
|||||||||||
C++程序设计例解(07) | |||||||||||
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:41:05 文章录入:杜斌 责任编辑:杜斌 | |||||||||||
|
|||||||||||
试编制程序,将输入的盒子排列状态按以下交换规则将全部‘A'放到全部‘B'的左边,不管相邻两空盒的位置。交换规则是任意两个非空相邻盒子的内容可移入两个空盒中,但移动时不得变更两符号的前后次序。编写程序输入初始配置后,找出达到目标要求的最少交换次数的方案。
试探深度增1; } }while(1); if(找到解) 输出解; } 程序代码如下: #include<stdio.h> #include<string.h> #define N 30 #define DEPTH 15 char b[2*N+1]; struct node { int empty; /*两空盒的开始位置*/ char s[2*N+1]; /*盒子排列*/ int no; /*下一个移动开始的位,或称移动方法*/ }q[DEPTH]; /*移动步聚表*/ char result[DEPTH][2*N+1]; /*存放解*/ char *s; int best,empty,i,j,n,an,bn,sn,c,d; void main() { printf("\nEnter N: "); scanf("%d",&n); printf("Enter initial state.\n"); /*输入初始状态*/ for(an=bn=sn=i=0;i<2*n;) { c=getchar(); if(c==' ') { if(sn)continue; /*强制两空白符连续出现*/ sn=1; empty=i; b[i++]='_'; b[i++]='_'; } if(c=='A'||c=='a') { if(an==n-1)continue; /*限制A的个数*/ an++;b[i++]='A'; } if(c=='B'||c=='b') { if(bn==n-1)continue; /*限制B的个数*/ bn++;b[i++]='B'; } } b[2*n]='\0'; strcpy(q[0].s,b); /*初始状态存入移动步聚表*/ q[0].empty=empty; q[0].no=0; best=DEPTH-1; /*设定试探深度*/ d=0; do { for(s=q[d].s; *s!='B';s++); for(;*s&&*s!='A';s++); if(*s=='\0') /*当前状态为盒子排列的终态*/ { for(j=0;j<=d;j++) /*保存解*/ strcpy(result[j],q[j].s); best=d; /*记录当前解的试探深度*/ d--; /*回溯*/ while(d>=0&&q[d].no==2*n-1)d--; if(d<0)break; /*取尽所有可能的选择*/ } if(d>=best||q[d].no==2*n-1) { d--; /*回溯*/
while(d>=0&&q[d].no==2*n-1)d--; if(d<0)break; /*取尽所有可能的选择*/ } else { empty=q[d].empty; /*新状态的空盒位置*/ j=q[d].no++; /*取当前状态的移动方法和设定新移动方法*/ if(d>=1&&q[d-1].empty==j)continue; /*掠过来回移动*/ s=q[d].s; /*取当前状态*/ /*掠过各种不希望的移动*/ if(s[j]=='_'||s[j+1]=='_')continue; if(j<empty&&s[j]=='A'&&s[j+1]=='A')continue; if(j>empty&&s[j]=='B'&&s[j+1]=='B')continue; if(empty!=0&&s[empty-1]!=s[j]&& (empty!=2*n-2&&s[empty+2]!=s[j+1]))continue; if(empty==0&&s[j]=='B')continue; if(empty==2*n-2&&s[j+1]=='A')continue; /*生成新状态*/ strcpy(q[d+1].s,q[d].s); /*形成移动后的状态*/ q[d+1].s[empty]=q[d+1].s[j]; q[d+1].s[empty+1]=q[d+1].s[j+1]; q[d+1].s[j]=q[d+1].s[j+1]='_'; q[d+1].empty=j; for(j=0;strcmp(q[j].s,q[d+1].s);j++); if(j<=d)continue; q[d+1].no=0; d++; /*试探深度增1*/ } }while(1); if(best!=DEPTH-1) { printf("\n\n"); for(j=0;j<=best;j++) printf("%s\n",result[j]); } } 程序运行结果如下: |
|||||||||||
![]() ![]() |