加分挺贴,求关注。
2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着。如图【1.jpg】所示。和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和E就可以移动,移动后的局面分别是:
A B
D E C
A B C
D E
为了表示方便,我们把6个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:
AB*DEC
ABCD*E
题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出1,否则输出0。初始状态为:ABCDE*
用户输入的格式是:先是一个整数n,表示接下来有n行状态。程序输出也应该是n行1或0
例如,用户输入:
3
ABCDE*
AB*DEC
CAED*B
则程序应该输出:
1
1
0
程序代码:
#include<stdio.h> #include<string.h> #include<malloc.h> static char s1[7]="ABCDE*"; int f=1; int main() { void fun(char *arry,char s,int k); int i,j,k=1,n; char a[30][7],c; scanf("%d",&n); getchar(c); for(i=0;i<n;i++) gets(&a[i][0]); for(i=0;i<n;i++) { if(bj(&a[i][0],s1)) { printf("1\n"); continue; } else fun(&a[i][0],s1,k); } } int bj(char *p,char *q) //类似strcmp函数。 { while(*p!=0) if(*p++!=*q++) return 0; return 1; } void swap(char *a,char *b) { char c; c=*a; *a=*b; *b=c; } void fun(char *arry,char *s,int k) //参数 arry 待判断的字符串 s初始的字符串 k 计数器 { char a[2][3],b[2][3],c[2][3],d[2][3],*p,*q; int i,j,x,y; if(bj(arry,s)) { printf("1\n"); return 0; } if(k>100) //当经历100判断无结果,则认为无效路径。 { printf("0\n"); return 0; } q=(char *)malloc(sizeof(char)*6); strcpy(q,s); for(i=0;i<2;i++) for(j=0;j<3;j++) { a[i][j]=b[i][j]=c[i][j]=d[i][j]=*q++; //放到4个数组里,表示同一种情况 上下左右各一次判断。 if('*'==a[i][j]) { x=i; y=j; } } if(y>0) { swap(&a[x][y],&a[x][y-1]); fun(arry,&a[0][0],k+1); } if(x>0) { swap(&b[x][y],&b[x-1][y]); fun(arry,&b[0][0],k+1); } if(y<2) { swap(&c[x][y],&c[x][y+1]); fun(arry,&c[0][0],k+1); } if(x<1) { swap(&d[x][y],&d[x+1][y]); fun(arry,&d[0][0],k+1); }160; printf("0\n"); return 0; }
这是我的代码,可以求出对的,但是0的情况判断不了,求高手指点
或者有更好的方法(不要太难,最好不要遍历链表之类的),也可以指出。最好能给出源码。 50分送上,新手分不多,望包含。