填表格:将1、2、3、4、5和6填入2行3列的表中,要使得每一个列右边的数字比左边的数字大,每一行下面的数字比上面的数字大。按此要求,可有几种填写方法?

填表格
将1、2、3、4、5和6填入2行3列的表中,要使得每一个列右边的数字比左边的数字大,每一行下面的数字比上面的数字大。按此要求,可有几种填写方法?
**输出提示信息:"The possible table satisfied above conditions are:\n"
**输出格式要求:"\nNo.:%d" "\n%3d"  "%3d"

思路:将所有矩阵穷举(包括重复数字的),然后做第一个判断:1.是否有重复的数字,满足条件可以做下一个判断:是否满足位置上的大小关系.很容易可以知道要写两个函数来满足此要求.以下是对于这道题目的解答:

int judge_value(int(*p)[3],int *n)
{
	int flag = 0;
	int temp = 0;
	for (int i = 0; i < 2; i++)//两个for循环构成对矩阵的一次判断
	{
		for (int j = 0; j < 3; j++)
		{
			if (p[0][j] < p[1][j])//下边大于上面
			{
				if (j != 2)//防止越界
				{
					if (p[i][j] < p[i][j + 1])//右边大于左边
					{
					}
					else
						flag = -1;
				}
			}
			else
			{
				flag = -1;
			}
		}
	}
	if (flag == 0)//每次循环结束之后判断一次
	{
		(*n)++;
	}
	if (flag == 0)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}
int judge_repet(int(*p)[3], int row)//还有优化的空间,将矩阵相同位置的元素比较了两次
{
	int n = 0;//n为计数器
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < 3;j++)
		{
			for (int k = 0; k < row; k++)
			{
				for (int l = 0; l < 3; l++)
				{
					if (p[i][j] == p[k][l])
					{
						n++;//判断数组中的一个元素和其他元素是否相等的时候,如果都不相等,那么n=6,如果有相等n>6,这里不容易理解,可以debug,输入数据进行尝试
					}
				}
			}
		}
	}
	return n;
}
int main()
{
	printf("The possible table satisfied above conditions are:\n");
	int n = 0;
	int* N = &n;
	int arr[2][3] = { 0 };
	for (int i = 1; i < 7; i++)
	{
		for (int j = 1; j < 7; j++)
		{
			for (int k = 1; k < 7; k++)
			{
				for (int l = 1; l < 7; l++)
				{
					for (int m = 1; m < 7; m++)
					{
						for (int n = 1; n < 7; n++)
						{
							arr[0][0] = i;
							arr[0][1] = j;
							arr[0][2] = k;
							arr[1][0] = l;
							arr[1][1] = m;
							arr[1][2] = n;
							if(judge_repet(arr,2)==6)
							{ 
								if (judge_value(arr, N)!=-1)
								{
									printf("\nNo.:%d\n", *N);
									for (int p = 0; p < 2; p++)
									{
										for (int q = 0; q < 3; q++)
										{
											printf("%3d", arr[p][q]);
										}
										if(p==0)
										printf("\n");
									}
								}
							}
						}
					}
				}
			}
		}
		return 0;
	}
}

代码写的比较简单粗暴,没有对代码进行优化.以上只是作为参考,希望大家可以给出更好的解答.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值