有个C语言题目请教大家,本人初学写出代码
有2行3列的矩形框,填入1,2,3,4,5,6六个数字,要求左边的比右边的大,上边的比下边的大,用 C 写出代码,编程求所有可能的填写方法。本人初学求大侠写出代码!!!谢谢
回复 楼主 jingtaichuan 的帖子
左边的比右边的大,上边的比下边的大??? 对角线么? 这样/or \?
/*----------------------------------------------------------------------------- 有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; }