习题7-5 找鞍点 (20分)

本文介绍了一个算法,用于在给定的n阶方阵中寻找鞍点,即在该行上最大且在该列上最小的元素。通过遍历矩阵,找到可能的鞍点并验证其属性,最终输出鞍点的位置或'NONE'。

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE
#include<stdio.h>
int main()
{
	int n,i,j,min,max;
	scanf("%d",&n);
    int a[n][n];
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	int index=0,judge=1;
	int k=0,l=0;
	if(n==1)
	{
		printf("0 0");
	}
	else
	{
	for(i=0;i<n;i++)
	{
		index=i;
		for(l=0;l<n;l++)
		{
			if(a[i][k]<=a[i][l])
			{
				k=l;
			}
		}//找出单行最大的数 
	for(j=0;j<n;j++)
	{
		if(a[index][k]>a[j][k])
		{
			index=j;
			break;
		}//判断是不是单列最小 
	}
	if(i==index)//判断行数是否相等 
	{
		judge=0;
		break;
	}
}
	if(judge==0)
	{
		printf("%d %d",i,k);
	}
	else
	{
		printf("NONE");
	}
}
	return 0;
} 
<think>根据用户意图,用户需要两层for循环的编程练习题。两层for循环通常用于处理二维数据、矩阵操作、嵌套结构等场景。下面我将提供几个适合不同编程语言(以Python和C++为主)的两层for循环练习题,并附上简要说明。 ### 练习题1:打印乘法口诀表 **要求**:使用两层for循环打印9×9乘法口诀表。 **输出示例**: ``` 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 ...(省略中间部)... 1*9=9 2*9=18 ... 9*9=81 ``` **关键点**:外层循环控制行数(1到9),内层循环控制每行的列数(1到当前行数)。 ### 练习题2:矩阵转置 **要求**给定一个3×3矩阵,使用两层for循环实现矩阵转置(行列互换)。 **输入示例**: ``` 原始矩阵: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ``` **输出示例**: ``` 转置后矩阵: [[1, 4, 7], [2, 5, 8], [3, 6, 9]] ``` **关键点**:外层循环遍历行,内层循环遍历列,交换`matrix[i][j]`和`matrix[j][i]`(注意避免重复交换)。 ### 练习题3:寻二维数组中的最大值及其位置 **要求**给定一个5×5的整数二维数组,使用两层for循环遍历数组,到最大值及其所在的行和列(假设数组元素不重复)。 **输入示例**: ``` [[ 3, 7, 2, 8, 1], [10, 4, 6, 9, 5], [15, 2, 0, 4, 7], [ 8, 3, 1, 5, 6], [ 4, 9, 7, 2, 3]] ``` **输出示例**: ``` 最大值: 15 位置: 第3行, 第1列(索引从1开始) ``` **关键点**:初始化最大值变量,遍历每个元素比较并记录位置。 ### 练习题4:打印特定图形 **要求**:使用两层for循环打印一个由星号(`*`)组成的直角三角形(直角在右下角)。 **输出示例**5行): ``` * * * * * * * * * * * * * * * ``` **关键点**:外层循环控制行数,内层循环控制每行打印的空格数和星号数(注意空格数的计算)。 ### 练习题5:计算二维数组每行的平均值 **要求**给定一个4×3的二维数组(浮点数),使用两层for循环计算每行元素的平均值,并输出结果。 **输入示例**: ``` [[1.2, 2.3, 3.4], [4.5, 5.6, 6.7], [7.8, 8.9, 9.0], [0.9, 1.0, 2.1]] ``` **输出示例**: ``` 第1行平均值: 2.3 第2行平均值: 5.6 ...(略)... ``` **关键点**:外层循环遍历行,内层循环遍历列累加行元素,再除以列数。 ### 练习题6:判断二维数组是否为对称矩阵 **要求**给定一个n×n的方阵,使用两层for循环判断其是否为对称矩阵(即`matrix[i][j] == matrix[j][i]`)。 **输入示例1**(对称): ``` [[1, 2, 3], [2, 4, 5], [3, 5, 6]] ``` **输入示例2**(不对称): ``` [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ``` **输出**:输出“是对称矩阵”或“不是对称矩阵”。 **关键点**:遍历上三角(或下三角)元素,比较对称位置的值。 ### 练习题7:两个矩阵相乘 **要求**给定两个矩阵A(m×n)和B(n×p),使用三层循环(两层for循环遍历结果矩阵的行列,一层内层循环计算点积)实现矩阵乘法。 **输入示例**: ``` 矩阵A(2×3): [[1, 2, 3], [4, 5, 6]] 矩阵B(3×2): [[7, 8], [9, 10], [11, 12]] ``` **输出示例**: ``` 结果矩阵(2×2): [[58, 64], [139, 154]] ``` **关键点**:结果矩阵的行数等于A的行数,列数等于B的列数,每个元素`C[i][j] = Σ(A[i][k] * B[k][j])`(k从0到n-1)。 ### 练习题8:生成杨辉三角 **要求**:使用两层for循环生成n行的杨辉三角(n由用户输入)。 **输出示例**(n=5): ``` 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 ``` **关键点**:每行首尾为1,中间元素等于上一行同列和前一列元素之和。 ### 练习题9:二维数组的边界元素求和 **要求**给定一个m×n的二维数组,计算边界元素(第一行、最后一行、第一列、最后一列)的和(注意四角元素不重复计算)。 **输入示例**: ``` [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] ``` **输出**:边界和 = 1+2+3+4+8+12+11+10+9+5 = 65 **关键点**:遍历数组,判断元素是否在边界(行索引为0或m-1,或列索引为0或n-1)。 ### 练习题10:查二维数组中的鞍点 **要求**鞍点是指该元素在所在行最大,在所在列最小(可能不存在)。给定一个n×n矩阵,使用两层for循环查所有鞍点**输入示例**: ``` [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ``` **输出**:无鞍点(因为3是第1行最大,但它在第3列不是最小)。 **关键点**:对每个元素,检查它是否为所在行的最大值且所在列的最小值(需要遍历行和列)。 ### 说明 以上练习题均要求使用两层for循环实现,适合巩固循环嵌套和二维数组操作。用户可根据熟悉的编程语言(如Python、C++、Java等)选择实现。如果需要参考代码或进一步解释,可以提出具体问题。 §§相关问题§§ 1. 如何优化两层for循环的时间复杂度? 2. 在矩阵乘法中,三层循环的顺序对性能有什么影响? 3. 除了两层for循环,还有哪些方法可以处理二维数组?</think>以下是针对两层for循环的编程练习题,涵盖矩阵操作、图形输出、数学计算等常见场景,适合Python、C++等语言练习: --- ### 练习题1:矩阵转置 **要求**:用两层for循环实现矩阵转置(行列互换) **输入示例**: ```python matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] ``` **预期输出**: ``` [[1, 4, 7], [2, 5, 8], [3, 6, 9]] ``` **关键点**:外层循环遍历行,内层循环遍历列,交换元素位置--- ### 练习题2:打印乘法口诀表 **要求**:使用两层for循环输出9×9乘法口诀表 **预期输出**: ``` 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 ...(省略)... 1*9=9 ... 9*9=81 ``` **提示**:外层控制行数$i$(1到9),内层控制列数$j$(1到$i$)。 --- ### 练习题3:二维数组边界求和 **要求**:计算一个$m \times n$矩阵的边界元素之和(四周边界) **输入示例**: ``` [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10,11,12]] ``` **预期输出**: ``` 边界和 = 1+2+3+4+8+12+11+10+9+5 = 65 ``` **关键点**:通过条件判断元素是否在首行/末行/首列/末列。 --- ### 练习题4:寻鞍点 **要求**:在$n \times n$矩阵鞍点(行最大且列最小) **输入示例**: ``` [[5, 3, 4], [2, 6, 1], [7, 8, 9]] ``` **预期输出**: ``` 鞍点:第2行第2列的值6(第2行最大,第2列最小) ``` **逻辑**: 1. 外层循环遍历每一行,到当前行最大值 2. 内层循环检查该值是否是其所在列的最小值 --- ### 练习题5:打印菱形图案 **要求**:根据输入高度$n$,用`*`打印对称菱形 **输入示例**:$n=3$ **预期输出**: ``` * *** ***** *** * ``` **实现思路**- 外层循环1:控制上半部行数($i$从1到$n$) - 内层循环1:打印空格(数量=$n-i$) - 内层循环2:打印`*`(数量=$2i-1$) - 外层循环2:控制下半部行数($i$从$n-1$到1) - 内层循环同上(反向) --- ### 练习题6:矩阵乘法 **要求**:实现两个矩阵$A_{m \times n}$和$B_{n \times p}$的乘法 **输入示例**: ``` A = [[1,2], [3,4]] # 2×2 B = [[5,6], [7,8]] # 2×2 ``` **预期输出**: ``` [[19, 22], [43, 50]] ``` **算法核心**: ```python for i in range(m): # 遍历A的行 for j in range(p): # 遍历B的列 sum = 0 for k in range(n): # 点积计算(此处需三层循环) sum += A[i][k] * B[k][j] result[i][j] = sum ``` > 注:严格来说是三层循环,但两层循环需遍历行列。 --- ### 练习题7:图像卷积模拟 **要求**:对$5 \times 5$矩阵应用$3 \times 3$卷积核(如边缘检测) **输入示例**: ``` 矩阵 = [[1,1,1,0,0], [1,1,1,0,0], [1,1,1,0,0], [0,0,0,0,0], [0,0,0,0,0]] 卷积核 = [[-1,-1,-1], [-1, 8,-1], [-1,-1,-1]] ``` **预期输出**:中心区域产生边缘响应值。 --- ### 附加挑战题 **题目**:用两层循环实现冒泡排序 **要求**:比较相邻元素,外层控制轮次,内层控制每轮比较次数。 **输入**:`[5, 3, 8, 6, 7, 2]` **输出**:`[2, 3, 5, 6, 7, 8]` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值