| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 532 人关注过本帖
标题:加分挺贴,求关注。
只看楼主 加入收藏
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
结帖率:87.5%
收藏
已结贴  问题点数:50 回复次数:5 
加分挺贴,求关注。
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
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:50 
我提个思路给你,从空的位置开始向四个方向递归,走过的路标记一下,每递归一次对比一下字符串
#include<stdio.h>
 #include<string.h>
 static int f[6],ff[6];
 char init[]="ABCDE*";
 void clear()
 {
 int i;
 for(i=0;i<6;i++)
 f[i] = ff[i] = 0;
 }
 void swap(char *t,char *tt)
 {
 char tmp;
 tmp= *t;
 *t=*tt;
 *tt=tmp;
 }
 int func(char *p,int n,int m)
 {
 int i,x,y,ret = 0;
 char a[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
 if(!strcmp(p,init))
 {
 return 1;
 }
 else
 {
 for(i=0;i<4;i++)
 {
 x = n + a[i][1];
 y = m + a[i][0];
 if((x>=0&&x<=1)&&(y>=0&&y<=2)&&(!f[3*n+m]||!ff[3*x+y]))
 {
 swap(p+3*n+m,p+3*x+y);
 f[3*n+m]=1;
 ff[3*x+y]=1;
 ret = func(p,x,y);
 swap(p+2*n+m,p+2*x+y);
 if(ret==1)
 {
 break;
 }
 }
 }
 return ret;
 }
 }
 void main()
 {
 char b[]="ABCDE*";
 char c[]="AB*DEC";
 char d[]="CAED*B";
 char e[]="*ABDEC";
 char ee[]="DAB*EC";
 printf("%d\n",func(b,1,2));
 clear();
 printf("%d\n",func(c,0,2));
 clear();
 printf("%d\n",func(d,1,1));
 clear();
 printf("%d\n",func(e,0,0));
 clear();
 printf("%d\n",func(ee,1,0));
 
}
你看看这个可行,羡慕嫉妒恨

Maybe
2013-04-24 10:18
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
网上搜啊 拼图游戏 或 滑块游戏 算法
看看 有没有高级点的算法
自己想 都是些笨方法 而且效率低

人生是一场错过 愿你别蹉跎
2013-04-24 11:17
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
深了点

三十年河东,三十年河西,莫欺少年穷!
2013-04-24 20:58
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
回复 2楼 邓士林
这个程序,相当似曾相识。不过谢谢了。其实我的程序思路也是对的,但我不知道用什么好的方法结束递归。
谢谢,还有那个标记的方法我的确没有想到啊,一言惊醒梦中人啊。
50分送上

有问题一起探讨,一起进步。
2013-04-25 09:59
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
收藏
得分:0 
回复 5楼 y3765258
想问下,你这个程序递归了多少次,?

一同学习, 一同进步
2013-04-26 17:03
快速回复:加分挺贴,求关注。
数据加载中...
 
   



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

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