此题很重要,送40分给大神们。
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 p1[7]="ABCDE*";
int main()
{
void fun(char *p,char *q,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],p1)) //判断输入的是否是初始化的数组。
{
printf("1\n");
continue;
}
else
fun(&a[i][0],p1,k); //参数 : 待判断数组,初始化数组,判断次数。
}
}
int bj(char *p,char *q) //比较两个字符串是否相等
{
while(*p!=0)
if(*p++!=*q++)
return 0;
return 1;
}
void fun(char *p,char *q,int k)
{
int i,j,x,y;
char a[2][3],t,*q1,*q2="ABCDE*";
q1=(char *)malloc(sizeof(char)*7);
strcpy(q1,q); //把数组放到新的堆里,进行下次递归。为了和每次递归的字符串分开。
if(bj(q2,q)&&k==200) //如果处理后的字符串又回到初始化,则结束递归。
{
return 0;
}
if(bj(p,q1)) //如果待输入字符,与递归处理后的字符相等。则返回1,结束递归。
{
printf("1\n");
return 0;
}
for(i=0;i<2;i++) //找出*号在字符数组里的位置,方便四个方向判断。
for(j=0;j<3;j++)
{
a[i][j]=*q1++;
if('*'==a[i][j])
{
x=i;
y=j;
}
}
if(y>0)
{
t=a[x][y];a[x][y]=a[x][y-1];a[x][y-1]=t;
fun(p,&a[0][0],k+1);
}
if(x>0)
{
t=a[x][y];a[x][y]=a[x-1][y];a[x-1][y]=t;
fun(p,&a[0][0],k+1);
}
if(y<2)
{
t=a[x][y];a[x][y+1]=a[x][y];a[x][y+1]=t;
fun(p,&a[0][0],k+1);
}
if(x<1)
{
t=a[x][y];a[x+1][y]=a[x][y];a[x+1][y]=t;
fun(p,&a[0][0],k+1);
}
printf("0\n");
}
上面是我写的代码,虽然很那个,求强忍。
如果代码还有改的余地,望指点。
如果代码思路错误,求大神写出代码,小弟学习了。这道题真的很重要。40分奉上!