| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 532 人关注过本帖
标题:加分挺贴,求关注。
取消只看楼主 加入收藏
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
结帖率:87.5%
收藏
已结贴  问题点数:50 回复次数:1 
加分挺贴,求关注。
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分送上,新手分不多,望包含。
搜索更多相关主题的帖子: 用户 编写程序 
2013-04-24 09:57
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
回复 2楼 邓士林
这个程序,相当似曾相识。不过谢谢了。其实我的程序思路也是对的,但我不知道用什么好的方法结束递归。
谢谢,还有那个标记的方法我的确没有想到啊,一言惊醒梦中人啊。
50分送上

有问题一起探讨,一起进步。
2013-04-25 09:59
快速回复:加分挺贴,求关注。
数据加载中...
 
   



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

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