矩阵填数
题⽬: 矩阵中填数. 当给出 N*N 的矩阵,要求⽤程序填⼊下列形式的数:例如N=5
① 倒填                                          ② 蛇形填数                        ③ 回转填数
25  24  23  22  21            1      3      4      10    11                1    16    15      14    13
20  19  18  17  16            2      5      9      12    19                2    17    24      23    12
15  14  13  12  11            6      8      13    18    20                3    18    25      22    11
10    9    8      7      6            7    14    17    21    24                4    19    20      21    10
5    4    3      2    1          15    1
6    22    23    25                5        6
7
8      9
解答:
第⼀种很简单,在打印的时候控制从⼤到⼩就可以了。
第⼆种,在打印的时候就不是很好办了,那么就先把数存在⼀个⼆维数组⾥⾯。
算法:
0.把1填在第⼀个位置
1.如果当前位置右上⾓可以填数,则把下⼀个数放在右上⾓,到1,不能则把数放在它的右边,                            如果右边不能放,则放在下⾯,到2。
2.如果当前位置左下⾓可以填数,则把下⼀个数放在左下脚,到2,不能则把数放在它的下⾯,                            如果下⾯不能放,则放在右边,到1。
在最外层加控制条件(所有数放完)
第三种和第⼆种⽅法相似,也是沿着指定的⽅式放数,到不能放时转换⽅向。
#include <iostream>
#include <cstring>
using namespace std;
void BackFill(int);
void SnakeFill(int);
void GyrationFill(int);
int main(){
cout<<"Input the size number:";
int n;
cin>>n;
BackFill(n);
SnakeFill(n);
GyrationFill(n);
}
void BackFill(int n){
cout<<"BackFill Number: ";
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cout<<n*n-j-i*n<<" ";
cout<<endl;
}
}
void SnakeFill(int n){
int** a=new int*[n];
for(int i=0;i<n;i++)
a[i]=new int[n];
int count=2,i=1,j=0;
a[0][0]=1;
while(count<=n*n){
while(i>=0 && j<n){
a[i][j]=count++;
i--;
j++;
}
if(j>=n)
j--,i++;
i++;
while(j>=0 && i<n)
{
a[i][j]=count++;
i++;
j--;
}
if(i>=n)
i--,j++;
j++;
}
cout<<"SnakeFill Number: ";
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
for(int i=0;i<n;i++)
cstring转为intdelete[] a[i];
delete[] a;
}
void GyrationFill(int n){
int** a=new int*[n];
for(int i=0;i<n;i++){
a[i]=new int[n];
memset(a[i],0,n*sizeof(int));                }
int count=1,i=0,j=0;
while(count<=n*n){
while(i<n && a[i][j]==0){
a[i][j]=count++;
i++;
}
i--,j++;
while(j<n && a[i][j]==0){
a[i][j]=count++;
j++;
}
j--,i--;
while(i>=0 && a[i][j]==0){
a[i][j]=count++;
i--;
}
i++,j--;
while(j>=0 && a[i][j]==0){
a[i][j]=count++;
j--;
}
j++,i++;
}
cout<<"GyrationFill Number: ";
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
for(int i=0;i<n;i++)
delete[] a[i];
delete[] a;
}
最后这个题还有⼀个需要注意的地⽅,就是我们开的⼆维数组⼤⼩要在运⾏的时候才能确定,所以只能开在堆区,在C++⾥⾯在堆区分配内存⽤的是运算符new,它返回它操作数类型的指针。但是它不能直接开两个维数都不确定的⼆维数组,我上⾯写的是⼀种开⼆维数组的⽅法。另外在我们⽤完了数组后,⼀定要记得清理内存,在C++⾥⽤运算符delete,对于清理数组⽤delete[] ,如果忘了写最后⼏⾏代码,就是C++⾥最常见的内存泄露问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。