| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 585 人关注过本帖
标题:此题很重要,送40分给大神们。
取消只看楼主 加入收藏
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:1 
此题很重要,送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分奉上!
搜索更多相关主题的帖子: 编写程序 用户 
2013-04-23 09:16
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
回复 2楼 beyondyf
第一次发表失败,然后忘了改点数。帮忙看下,下次发个送分贴。。。

有问题一起探讨,一起进步。
2013-04-23 14:21
快速回复:此题很重要,送40分给大神们。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016204 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved