| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 546 人关注过本帖
标题:我数学很不好,程序的这个定义不知道如何定义的。
只看楼主 加入收藏
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
结帖率:94.44%
收藏
已结贴  问题点数:20 回复次数:2 
我数学很不好,程序的这个定义不知道如何定义的。

    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>
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}};
    count++;
    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;  //转变后的串       //问题是如何算出该程序最多只需要递归12次呢,?
                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));
    printf("第一次递归了:%d\n",count);
    clear();
    count = 0;
    printf("%d\n",func(c,0,2));
    printf("第二次递归了;%d\n",count);
    clear();
    count = 0;
    printf("%d\n",func(d,1,1));
    printf("第三次递归了:%d\n",count);
    count = 0;
    clear();
    printf("%d\n",func(e,0,0));
    printf("第四次递归了:%d\n",count);
    count = 0;
    clear();
    printf("%d\n",func(ee,1,0));
    printf("第五次递归了:%d\n",count);

}
搜索更多相关主题的帖子: 编写程序 如何 用户 
2013-05-02 20:44
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:20 
我发现我俩看题都看一块去了,这道题我和同学讨论过。
标记的方法,只适合这道题。因为这道题的数组纬度很小。*号的所有坐标都有唯一对应的图像。
如果数组的维数变大了,你会发现即使*号走回原位,图形也变样了,那时候标记就没用了。
ps:你是不是明天考试?蓝桥杯的。

有问题一起探讨,一起进步。
2013-05-03 17:38
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
收藏
得分:0 
回复 楼主 dengluoy
是的呢。这道题目,我用了两种方法做。
 但都没有这个方法的运行速度快。。 你是哪个赛区的,?

一同学习, 一同进步
2013-05-04 00:31
快速回复:我数学很不好,程序的这个定义不知道如何定义的。
数据加载中...
 
   



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

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