人人有本用

首页 » 虫窝销售专区 » ThinkPad 行情交流 » 有没有编程狂人,我的头都大了
pzc - 2001/9/6 9:25:00
老师要我们做个课题,可是我思路的几块就是连不起来

谁能帮帮我啊

只要有人留下联系方法,

我一定联系
ter - 2001/9/6 9:27:00
www.nowdigi.net
里面的newbie world
好多菜鸟和好多高手在
gzrainman - 2001/9/6 9:47:00
说出来听听?大伙才能帮你参考参考啊
samfl - 2001/9/6 11:02:00
是啊,这里好象也有不少编程高手。
koyiyi - 2001/9/6 14:04:00
什么课题。用什么做。C。VB。VFP。?
pzc - 2001/9/6 15:19:00
在一个由M*N个小正方形组成的矩形上,依次用两个相等的小正方形大小的矩形(此处所谓相邻是指两个正方形有一条公共边)不重复的覆盖该矩形区域。请构造出该问题的模型,设计算法求解所有可能的覆盖。PASCAL C语言都可,或者写出算法类PASCAL语言。


我的思路是用深度遍力,用回溯,求通过所有点的简单路径
控制图形,可是具体代码的时候,我有很大困难,有高手花点时间帮我搞定吗?
pzc - 2001/9/9 8:59:00
UP

谁能帮帮我
ylwindy - 2001/9/9 10:24:00
const m=50
const n=50
int step[4][2]=
{
    -1,0,
    1,0,
    0,-1,
    0,1
}

int matrix[m][n]={0,};
int remain = 0;

void travelpanel(int xextra,int yextra,int curX,int curY)
{
    curX += xextra;
    curY += yextra;
    int i;
    if ( (curX <= n && curX >= 0 ) && (curY <= m && curY>=0)
        && matrix[curY][curX] == 0)
    {
        matrix[curY][curX] = remain;
        remain --;
        if(!remain)    //所有的方块都覆盖完了
        {
            //找到了一个好的通道,按矩阵里面数据值m*n,m*n-1,...,1,
            //从大到小顺序所在的x,y打印出来,就是一条覆盖路径
        }
        else
        {
            for( i = 0 ; i < 4; i++)
                travelpanel(step[i][0],step[i][1],curX,curY);
        }
        matrix[curY][curX] = 0;
        remain ++;
    }
}

void travel(void)
{
    int i;
    matrix[0][0] = remain;
    remain -- ;
    for( i = 0 ; i < 4; i++)
        travelpanel(step[i][0],step[i][1],0,0);
    
}
    
void main(void)
{
    remain = m*n;    
    travel();
}




随手写了一个,因为要所有可能的路径,所以路径打印部分烦了一点,没有写代码,如果只打印一条的话,会方便很多
程序是现写的没有编译过,可能会有语法错误,打印路径部分没有写
ylwindy - 2001/9/9 10:25:00
排版怎么变成这样了?吃/tab啊
丘比特 - 2001/9/11 22:00:00
#define MAX 50
int sd[MAX][MAX];
struct stacka{int x;
int y;
int direct;};
typedef struct stacka STACKA;
typedef struct move{int x;int y;} MOVE;
MOVE mv[5];
STACKA stack[MAX*MAX];
void setmove()
{mv[1].x=0;mv[1].y=-1;
mv[2].x=1;mv[2].y=0;
mv[3].x=0;mv[3].y=1;
mv[4].x=-1;mv[4].y=0;}
void travel(m,n)
int m;
int n;
{int a,i,j,x,y;
i=1;
x=y=j=0;

while(x>=0&&y>=0)
{if(x==0&&y==0&i==5) break;
do{if((x+mv[i].x=0)&&(y+mv[i].y>=0)&&
    (sd[x+mv[i].x][y+mv[i].y]==0))
{stack[j].x=x;
stack[j].y=y;
stack[j].direct=i;
j++;
sd[x][y]=1;
x=x+mv[i].x;
y=y+mv[i].y;
i=1;
break;}
i++;}
while(i<5);
if(i>=5)
{sd[x][y]=0;
x=stack[--j].x;
y=stack[j].y;
i=stack[j].direct+1;
}
if(j==m*n-1)
{stack[j].x=x;
stack[j].y=y;
for(a=0;a<=j;a++)
printf("x=%d,y=%d**stack[a].x,stack[a].y);
printf("\n");
sd[x][y]=0;x=stack[--j].x;
y=stack[j].y;
i=stack[j].direct+1;
}
}}

void main()
{int m,n;
scanf("%d,%d**&m,&n);
setmove();
travel(m,n);
}
丘比特 - 2001/9/11 22:01:00
pzc,我的做法可是按照你原来的思路,用书上标准的回溯法解的。
丘比特 - 2001/9/11 22:06:00
呀。引号和逗号连用怎么变成了**。不会吧,这也是敏感字眼啊?
1
查看完整版本: 有没有编程狂人,我的头都大了