晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。
输入格式
输入第一行包括由空格分开的整数 M,N,TT 的值为 0 或1。其中 M 和 N 分别表示待处理矩阵的行数与列数,T为 0 时表示左右翻转,为 1 时表示上下翻转。
之后的 MM 行,每行包括由空格分隔的 NN 个整数,依次为输入矩阵的每一行的数据。
输出格式
输出包括 MM 行 NN 列,每个数字之间用一个空格分隔,每一行行末均有一个空格,表示的是按照要求翻转后的矩阵。
样例输入
4 4 1
1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6
样例输出
3 4 5 6
9 0 1 2
5 6 7 8
1 2 3 4
#include <iostream>
using namespace std;
int main()
{
int size_row,size_column,T;
int r,c;
cin>>size_row;
cin>>size_column;
cin>>T;
int **matrix=new int * [size_row];
for(r=0;r<size_row;r++)
matrix[r]=new int [size_column];
for(r=0;r<size_row;r++)
for(c=0;c<size_column;c++)
cin>>matrix[r][c];
int m=size_row,n=size_column;
int i,j;
int transfer;
if(T==1)
{
for(j=0;j<=m-1;j++)
{
for(i=1;i<=n/2;i++)
{
transfer=matrix[i-1][j];
matrix[i-1][j]=matrix[m-i][j];
matrix[m-i][j]=transfer;
}
}
}
else
{
for(i=0;i<=m-1;i++)
{
for(j=1;j<=n/2;j++)
{
transfer=matrix[i][j-1];
matrix[i][j-1]=matrix[i][n-j];
matrix[i][n-j]=transfer;
}
}
}
for(r=0;r<size_row;r++)
{
for(c=0;c<size_column;c++)
{
cout<<matrix[r][c]<<" ";
}
cout<<endl;
}
for(r=0;r<r<size_row;r++)
delete[] matrix[r];
delete[] matrix;
return 0;
}
上面是自己最初写的,开始还想使用自定义函数,但是由于对二维数组作为形参的方法还没掌握,故采用一个函数的形式。运行可以出来结果,但会报错:
段错误,也就是segmentfault, 可能您的代码出现栈溢出或非法指针访问。
调试通过的代码如下:
#include <iostream>
using namespace std;
int main()
{
int size_row,size_column,T;
int r,c;
cin>>size_row;
cin>>size_column;
cin>>T;
int matrix[200][200];
for(r=0;r<size_row;r++)
for(c=0;c<size_column;c++)
cin>>matrix[r][c];
int m=size_row,n=size_column;
int i,j;
int transfer;
if(T==1)
{
for(j=0;j<=n-1;j++)
{
for(i=1;i<=m/2;i++)
{
transfer=matrix[i-1][j];
matrix[i-1][j]=matrix[m-i][j];
matrix[m-i][j]=transfer;
}
}
}
else if (T==0)
{
for(i=0;i<=m-1;i++)
{
for(j=1;j<=n/2;j++)
{
transfer=matrix[i][j-1];
matrix[i][j-1]=matrix[i][n-j];
matrix[i][n-j]=transfer;
}
}
}
else cout<<"ERROR"<<endl;
for(r=0;r<size_row;r++)
{
for(c=0;c<size_column;c++)
{
cout<<matrix[r][c]<<" ";
}
cout<<endl;
}
return 0;
}