有个C语言题目请教大家,本人初学写出代码
有2行3列的矩形框,填入1,2,3,4,5,6六个数字,要求左边的比右边的大,上边的比下边的大,用 C 写出代码,编程求所有可能的填写方法。本人初学求大侠写出代码!!!谢谢
2008-12-14 14:33
2008-12-14 14:39
2008-12-14 14:47
程序代码:/*-----------------------------------------------------------------------------
有2行3列的矩形框,填入1,2,3,4,5,6六个数字,要求左边的比右边的大,
上边的比下边的大,用 C 写出代码,编程求所有可能的填写方法。
------------------------------------------------------------------------
我的想法:用全排列把 6 个数字全部排列,然后从中找出符合条件的组合。
代码的质量不高,请楼主参考一下。并请高手指出错误,谢谢。
----------------------------------------------------------------------------*/
#include<stdio.h>
#define SWAP(b,c) {int t=b;b=c;c=t;}
#define X 2
#define Y 3
#define N 6
int a[X][Y];
void endow(int *num)/* 赋值,把二维数组变为一维指针形式 */
{
int *b,i=0;
b=a;
while(i++<N)
*b++=*num++;
}
int check() /* 检查组合,如果不符合条件,返回 0 ,否则,返回 1 */
{
int i,j,k;
for(i=0;i<X;++i)
for(j=0;j<Y;++j)
for(k=j+1;k<Y;++k)
if(a[i][j]<a[i][k])
return 0;
for(i=0;i<Y;++i)
for(j=0;j<X;++j)
for(k=j+1;k<X;++k)
if(a[j][i]<a[k][i])
return 0;
return 1;
}
void print() /* 输出 */
{
int i,j;
if(check()) /* 如果返回值为真,输出数组 */
{
for(i=0;i<X;++i)
{
for(j=0;j<Y;++j)
printf("%3d",a[i][j]);
printf("\n");
}
printf("-----------------\n");
}
}
void SORT(int *num,int k) /* 全排列 */
{
int i;
if(k+1==N)
{
endow(num);
print();
return;
}
SORT(num,k+1);
for(i=k+1;i<N;++i)
{
SWAP(num[k],num[i]);
SORT(num,k+1);
SWAP(num[k],num[i]);
}
}
int main(void)
{
int num[N];
int i=0;
for(;i<N;++i) /* 定义个一维数组,并赋值 */
num[i]=i+1;
SORT(num,0);
return 0;
}
2008-12-14 21:59

2008-12-15 12:31