加分挺贴,求关注。
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分送上,新手分不多,望包含。









