填表格 将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;
}
}
代码写的比较简单粗暴,没有对代码进行优化.以上只是作为参考,希望大家可以给出更好的解答.