矩阵的鞍点

来源:互联网 发布:我的世界编程网站 编辑:程序博客网 时间:2024/05/01 16:23
/**此程序用来计算一个M行N列的矩阵的鞍点。*矩阵的鞍点是指矩阵中的一个位置,*该位置上的元素在其所在的行上最大、列上最小。*一个矩阵也可能没有鞍点。*/#include <iostream>using namespace std;const int M = 3, N = 4;//M、N分别表示矩阵的行数和列数void loc(int a[][N], int m);int main(){int a[M][N];//矩阵的行数和列数为常量,用二维数组表示cout << "请输入一个" << M << "×" << N << "的矩阵:" << endl;for (int i = 0; i < M; i++)//外层循环按行移动for (int j = 0; j < N; j++)//内层循环在每一行内按列移动cin >> a[i][j];//用户依次输入数组元素loc(a, M);return 0;}/*loc函数实现判断一个矩阵的鞍点的有无并输出判断结果*/void loc(int a[][N], int m){int num_of_saddle_point = 0;//num_of_saddle_point表示鞍点的总数for (int i = 0; i < m; i++)//外层循环按行移动,i表示外层循环的循环变量{int index_max = 0;//将最大元素的下标index_max初始化成0for (int j = 0; j < N; j++)//内层循环在每一行内按列移动if (a[i][j] > a[i][index_max])//遍历这一行中的元素,并与目前最大的元素比较index_max = j;//更新最大元素下标//a[i][index_max]即为矩阵第i行元素中最大的元素,如果有多个最大的元素,这是第一个/*下面判断第i行中最大的元素是否是所在列中最小的元素*/bool flag = true;//初始化为真for (int t = 0; t < m; t++)//重新进行按列移动的循环,与外层循环无关,没涉及外层循环变量iif (a[t][index_max] < a[i][index_max])<span style="white-space:pre"></span>//如果第i行中最大的元素所在列中有比它更小的元素{flag = false;break;}if (flag)//条件为真说明第i行中最大的元素所在列中没有比它更小的元素{cout << "该矩阵的鞍点为第" << i + 1 << "行第" << index_max + 1 << "列" << endl;num_of_saddle_point++;//鞍点的总数加1}/*下面考虑一行中最大的元素不唯一的情况*/if (index_max != N - 1)//如果找到的最大元素不是所在行的最后一个元素,则需判断之后的元素{for (int k = index_max + 1; k < N; k++)<span style="white-space:pre"></span>//遍历已找到的元素所在行位于其后的元素,k表示元素所在列的下标{if (a[i][k] == a[i][index_max])//如果找到下一个最大元素{index_max = k;bool conflag = true;//标志此元素是否为所在列中最小元素的bool变量conflagfor (int s = 0; s < m; s++)if (a[s][index_max] < a[i][index_max]){conflag = false;break;}//如果此元素所在列中有比它更小的元素,那么conflag为假if (conflag)//条件为真说明此元素所在列中没有比它更小的元素{cout << "该矩阵的鞍点为第" << i + 1 << "行第" << k + 1 << "列" << endl;num_of_saddle_point++;//鞍点的总数加1}}}}}if (num_of_saddle_point == 0)//鞍点总数为0说明该矩阵没有鞍点cout << "该矩阵没有鞍点!" << endl;}

1 0