pzc - 2001/9/6 9:25:00
老师要我们做个课题,可是我思路的几块就是连不起来
谁能帮帮我啊
只要有人留下联系方法,
我一定联系
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语言。
我的思路是用深度遍力,用回溯,求通过所有点的简单路径
控制图形,可是具体代码的时候,我有很大困难,有高手花点时间帮我搞定吗?
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
呀。引号和逗号连用怎么变成了**。不会吧,这也是敏感字眼啊?