您的位置:首页 > 其它

像素翻转、清除行列、彻底搞懂int *a[10]和int (*a)[10]

2015-11-06 20:31 411 查看
 

题目描述

有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。

测试样例:

[[1,2,3],[4,5,6],[7,8,9]],3

返回:[[7,4,1],[8,5,2],[9,6,3]]


class Transform {
public:
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
int i = 0;
int j = 0;
int temp;

for(i = 0;i<n;i++)
{
for(j = i;j<n;j++)
{
if(i != j)
{
temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
}

for(i = 0;i<n;i++)
for(j = 0;j<n/2;j++)
{
temp = mat[i][j];
mat[i][j] = mat[i][n-j-1];
mat[i][n-j-1]=temp;
}

return mat;

}

};


python 代码
#coding:utf-8

class Transform:
def transformImage(self,mat,n):
m = []
num  = n
for i in range(n):
s = []
num = n
while num > 0:
s.append(mat[num-1][i])
num -= 1

m.append(s)

return m

if __name__ == '__main__':

mat = [[1,2,3],[4,5,6],[7,8,9]]
mytrans = Transform()
print mytrans.transformImage(mat,3)

题目描述

请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。

给定一个MxN的int[][]矩阵(C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。

测试样例:
[[1,2,3],[0,1,2],[0,0,1]]

返回:[[0,0,3],[0,0,0],[0,0,0]]


class Clearer {
public:
vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
int i = 0;
int j = 0;
int k = 0;
int  a[300][300] = {0};
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(mat[i][j] == 0)
{
a[i][j] = 1;
}
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(a[i][j] == 1)
{
for(k = 0;k< n;k++)
{
mat[i][k] = 0;
mat[k][j] = 0;
}
}

return mat;

}
};


这次用到c语言的完全书写的时候遇到问题了,也就是int *a[10]和int (*a)[10]的问题,在传二位数组需要用int (*mat)[10]这种类型,我终于懂了,二位数组的列数必须已知
#include <stdio.h>

void clearZero(int (*mat)[3], int n) {
int i = 0;
int j = 0;
int k = 0;
int  a[300][300] = {0};
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(mat[i][j] == 0)
{
a[i][j] = 1;
}
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(a[i][j] == 1)
{
for(k = 0;k< n;k++)
{
mat[i][k] = 0;
mat[k][j] = 0;
}
}
}

int main(int argc,char **argv[])

int mat[3][3]={{1,2,3},{0,1,2},{0,0,1}};
int i = 0;
int j = 0;
clearZero(mat,3);

for(i = 0 ;i < 3;i++)
{
for(j = 0;j < 3;j++)
printf("%d ",mat[i][j]);
printf("\n");
}
return 0;
}
区别int *a[10]和int (*a)[10]的代码
#include <stdio.h>

int main(int argc,char *argv[])
{
int i = 0;
int j = 0;
int a[6]={0,1,2,3,4,5};
int (*p)[5];
int *q[5];

q[1]=a;

//printf("%d\n",*q[0]);
//printf("%d\n",*q[1]);
//printf("%d\n",(*(q+1))[2]);
// printf("%d\n",(*q)[3]);
// printf("%d\n",(*q)[4]);
for(i = 0;i<6;i++)
printf("%d ",q[1][i]);
printf("\n");

/*    p = &a;

for(i = 0; i <5 ;i++)
printf("%d ",*(*p+i));

printf("\n");
*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: