題目:一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。
本題要求撰寫程式,求一個給定的n階方陣的鞍點。
輸入格式:
輸入第一行給出一個正整數n(1≤n≤6)。隨后n行,每行給出n個整數,其間以空格分隔。
輸出格式:
輸出在一行中按照“行下標 列下標”(下標從0開始)的格式輸出鞍點的位置。如果鞍點不存在,則輸出“NONE”。題目保證給出的矩陣至多存在一個鞍點。
我的代碼:
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int max[n]; //最大值陣列
int min[n]; //最小值陣列
int a[n][n]; //定義二維陣列
if(n>=1&&n<=6){
int c=0;//判斷引數
int i; //計數器
int j; //計數器
int u; //break引數
int x,y; //二維陣列橫縱坐標
char b=' '; //空格
for(i=0;i<n;i++){
for(j=0;j<n;j++){
cin>>a[i][j];
}
} //輸入矩陣
for(i=0;i<n;i++){
max[i]=a[i][0];
for(j=0;j<n;j++){
if(max[i]<=a[i][j]){
max[i]=a[i][j];
}
}
} //最大值陣列找到各行最大值
for(j=0;j<n;j++){
min[j]=a[0][j];
for(i=0;i<n;i++){
if(min[j]>=a[i][j]){
min[j]=a[i][j];
}
}
} //最小值陣列找到各列最小值
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(max[i]==a[i][j]){
x=j;
}
if(a[i][x]==min[x]){
y=i;
c=1;
u=1;
break;
}
}
if(u==1){
break;
}
}
if(c==1){
cout<<y<<b<<x<<endl;
}
else{
cout<<"NONE"<<endl;
}
}
return 0;
}
vscode上可以正常找到鞍點,但在pta上顯示段錯誤
陣列也不大也是在全域定義的,最多嵌套了兩層回圈堆疊容量應該夠。
uj5u.com熱心網友回復:
int n, *max, *min, **a;
cin>>n;
if (n < 1 || n > 6) {
cout<<"Input error!"<<endl;
return -1;
}
max = new int [n];
min = new int [n];
a = new int *[n];
for (int i = 0; i < n; i++)
a[i] = new int [n];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin>>a[i][j];
用動態陣列
檢查鞍點的方法:
void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col)
{
int i, j, k, cnt = 0;
int row_idx, col_idx;
int max_row, min_col;
for (i = 0; i < row; i++) {
max_row = array[i][0];
col_idx = 0;
/* find max value in row */
for (j = 1; j < COL; j++)
if (max_row < array[i][j]) {
max_row = array[i][j];
col_idx = j;
}
/* Find min value in col */
min_col = array[i][col_idx];
row_idx = i;
for (k = 0; k < row; k++)
if (min_col > array[k][col_idx]) {
min_col = array[k][col_idx];
row_idx = k;
}
/* Check the condition*/
if (row_idx == i && min_col == max_row) {
point[cnt][0] = row_idx;
point[cnt][1] = col_idx;
cnt++;
}
}
}
uj5u.com熱心網友回復:
可以給我用動態陣列檢查鞍點的完整代碼讓我跑一下嗎,不是很理解
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/210256.html
標籤:C語言
