其他典型算法之矩阵应用-专项训练浙江2022届选考专用(学生版).docx
其他典型算法之矩阵应用【例1】 把矩阵A的行和列互相交换所产生的矩阵称为A的转置矩阵,这一过程称为矩阵的转置,如 。以下VB6程序实现矩阵的转置,请在划线处填入正确的语句实现功能。Const m = 4Const n = 5Dim a(1 To m * n) As IntegerDim b(1 To m * n) As IntegerPrivate Sub Command1_Click()Dim i As Integer, j As IntegerList1.ClearList2.ClearRandomizeFor i = 1 To m * n'生成源矩阵a(i) = Int(Rnd() * 89 + 10)NextFor i = 1 To m'显示源矩阵s = For j = 1 To n s = NextList1.AddItem sNextFor i = 1 To n '生成并显示转置矩阵s = For j = 1 To mb(i - 1) * m + j) = s = s + Str(b(i - 1) * m + j)NextList2.AddItem sNextEnd Sub【例2】.(2017·11浙江选考)由数组a生成数组b的方法描述如下:(1)将数组a中的n个元素依次分割出若干个数据块,每个数据块有m×m个元素,m最大值为8,最小值为2。分割时,按尽可能大的数据块进行分割。(2)对每个分割出的数据块用“方阵转换法”进行转换,每次转换后得到的数据块依次存储在数据b中。(3)数组a分割后的剩余元素(个数小于4),直接依序存储到数组b中。例如n=140时,可依次分割出3个数据块,元素的个数分别为64(8×8)、64(8×8)、9(3×3),剩余元素为3个。“方阵转换法”过程如下:将数据块中m×m个元素按行序排列成一个数字方阵,从该数字方阵中按列序得到转换后元素的次序。以3×3数据块为例,转换过程如下图所示:小明依据上述描述设计了如下VB程序。请回答下列问题:(1)当n=120时,分割出的第3个数据块元素个数为。 (2)请在划线处填入合适的代码。Const n = 120Dim a(1 To n) As IntegerDim b(1 To n) As IntegerPrivate Sub Command1_Click()Dim m As Integer, i As IntegerDim Start As Integer'当前未分割数据的第1个元素下标Dim Left As Integer'当前未分割数据的个数Dim pa As Integer'数组a的下标Dim pb As Integer'数组b的下标'读取n个转换前的数据,依次存储到a(1)、a(2)、a(n)中,代码略m = 8Start = 1Left = nDo While Left > 3If Left < m * m Thenm = Elsepa = Startpb = StartFor i = 1 To m * mb(pb) = a(pa)pb = pb + 1If i Mod m = 0 Then Else pa = pa + mEnd IfNext i Start = Start + m * mEnd IfLoopFor i = Start To nb(i) = a(i)Next i'依次输出转换后数据b(1)、b(2)、b(n)中,代码略End Sub课后作业1.某程序功能如下:数组a中存放了n n个10到99之间的随机整数,按n行n列的形式在列表框List1中显示(即第一行依次显示a(1)a(n),第二行依次显示a(n+1)a(2 n),依次类推)。在文本框Text1中输入某矩形区域的左上角位置(x1,y1)(注:x1表示列号,y1表示行号),在文本框Text2中输入右下角位置(x2,y2),单击“垂直翻转”按钮Command1,对以(x1,y1)和(x2,y2)为对角顶点的矩形区域中的数据进行垂直翻转,并在列表框List2中显示。程序运行界面如图所示。(1)依据上述描述设计如下VB程序。请在划线处填入合适的代码。Const n=5Dim a(1 To n2) As Integer,b(1 To n2) As IntegerPrivate Sub Form_Load()'产生n n个10到99之间的随机整数存数组a,并在List1中显示。代码略。End SubPrivate Sub Command1_Click()Dim i As Integer,j As Integer,value As String,c As String,xy(1 To 4) As Integers=Text1.Text+,+Text2.Textvalue= :j=0For i=1 To Len(s)c=Mid(s,i,1)If c>=0 And c<=9 Thenvalue=value+cElse xy(j)=Val(value):value= End IfNext ixy(4)=Val(value)For i=1 To nFor j=1 To nIf j>=xy(1) And j<=xy(3) And i>=xy(2) And i<=xy(4) Thenb(i-1) n+j)= Elseb(i-1) n+j)=a(i-1) n+j)End IfNext jNext iList2.Clear:c= For i=1 To n nc=c+Str(b(i)if then List2.AddItem cc= end ifNext iEnd Sub(2)对于有10 10个元素构成的数组a,如果输入左上角位置是(2,3),右下角位置是(6,7),垂直翻转后,则元素a(23)在新数组中的位置是。 2.某人编写一个VB程序,功能如下:程序启动时产生n n个1到50之间的随机整数存数组a,如n=8时,产生64个随机整数,以行优先方式,按8行8列的形式在列表框List1中显示(即第一行依次显示a(1)a(8),第二行依次显示a(9)a(16),依次类推)。在文本框Text1中输入某矩形区域的左上角位置(x1,y1)(注:x1表示行号,y1表示列号),在文本框Text2中输入右下角位置(x2,y2),单击“水平翻转”按钮Command1,对以(x1,y1)和(x2,y2)为对角顶点的矩形区域中的数据进行水平翻转,并在列表框List2中显示。程序运行界面如图1所示,变换前的数据区域的值如图2所示,变换后的值如图3所示。图110448262813923022251440264646472411845291541 图262844103029132826401425221244746464115294518 图3实现上述功能的VB程序如下,请回答下列问题:(1)根据题意可知,此次程序运行时数组元素a(12)的值为(填写数值)。 (2)请在划线处填入合适的代码。Const n=8Dim a(1 To n2) As Integer,b(1 To n2) As IntegerFunction adj(s As String,n As Integer)As String'该函数功能:在字符串s前添加若干空格,实现右对齐。代码略。End FunctionPrivate Sub Form_Load()'产生n n个1到50之间的随机整数存数组a,并List1中显示。代码略。End SubPrivate Sub Command1_Click()Dim x1 As Integer,y1 As Integer,x2 As Integer,y2 As IntegerDim i As Integer,j As Integer,value As Integer,line As Stringvalue=0s=Text1.TextFor i=1 To Len(s)If Mid(s,i,1)>=0And Mid(s,i,1)<=9 Then Elsex1=value:value=0End IfNext iy1=value'读取Text2中输入矩形区域的右下角位置,处理后把行号存x2,列号存y2。代码略。For i=1 To nFor j=1 To nIf i>=x1 And i<=x2 And j>=y1 And j<=y2 Thenb(i-1) n+j)= Elseb(i-1) n+j)=a(i-1) n+j)End IfNext jNext iFor i=1 To n2line=line+adj(Str(b(i),3)If Then List2.AddItem lineline= End IfNext iEnd Sub3.小王设计了一个顺时针旋转矩阵的程序,其功能为:运行程序时,在文本框Text1中输入矩阵规模n,点击“产生矩阵”按钮Command1,在列表框List1中显示一个n×n的矩阵,该矩阵数据由从1开始的连续自然数组成。点击“旋转矩阵”按钮Command2,该矩阵顺时针旋转90度并显示在列表框List2中。此后,每点一次“旋转矩阵”按钮Command2,列表框List2中显示的矩阵顺时针旋转90度。程序运行界面如图所示。(1)运行程序,在文本框Text1中输入5,点击“产生矩阵”按钮Command1,再连续点击三次Command2按钮,则列表框List2中第一行显示的内容是。 (2)实现此程序的代码如下,请在划线处填入合适的代码。Dim n As Integer,st As StringDim a(1 To 100) As IntegerDim b(1 To 100) As IntegerPrivate Sub Command1_Click()n=Val(Text1.Text)For i=1 To n na(i)=iNext iFor i=1 To nst= For j=1 To nst=st+adj(Str(a(i-1) n+j),3)Next jList1.AddItem stNext iEnd SubPrivate Sub Command2_Click()List2.ClearFor i=1 To nst= For j=1 To nb(i-1) n+j)= st=st+adj(Str(b(i-1) n+j),3)Next jList2.AddItem stNext iFor i=1 To n na(i)= Next iEnd Sub'adj函数的功能:在字符串a前加入适当的空格,使a的长度为n位Function adj(a As String,n As Integer) As StringDim sa As Stringna=Len(a):sa=aFor i=1 To n-nasa= +saNext iadj= End Function4.皇后的势力范围。在国际象棋,皇后的攻击范围是经过所在位置的任何直线和对角线,如图所示:用VB设计一自定义函数,给定皇后所在位置p1和对方所在棋子位置p2(位置编号如上图所示,编号从左到右,从上到下,左上起第1格为),判断皇后是否可以攻击对方棋子,如果可以返回true,不行则返回false。程序如下,请在划线处填入正确的语句。Function judge(p1 As Integer,p2 As Integer) As BooleanDim f As Boolean,x1 As Integer,y1 As IntegerDim x2 As Integer,y2 As Integerx1=p1 Mod 8y1=p18x2=p2 Mod 8y2=p28If x1=x2 Or y1=y2 Or Then f=TrueElsef=FalseEnd Ifjudge=fEnd Function