像素翻转、清除行列、彻底搞懂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; }
相关文章推荐
- v5
- 【DP】 HDOJ 3507 Print Article
- C++模板库(包含C++11特性)
- HDU 4612——Warm up——————【边双连通分量、树的直径】
- YOU健康小助手
- 剑指Offer——链表中快行指针用法(链表中倒数第k个结点等)
- JavaScript设计模式 Item 7 --策略模式Strategy
- [TwistedFate]category Extensxion protocol
- Linux shell(1)
- mysql事务
- JavaScript设计模式 Item 7 --策略模式Strategy
- HDU2087-剪花布条-KMP模板
- 简易 SolidWorks的三维飞行器模型建立教程
- 调整数组使奇数全部都位于偶数前面
- redis3.0集群状态监控脚本用于zabbix监控需要python2.6
- SpringMVC 学习系列 (1) 之 初识SpringMVC
- Android——网络编程
- swift 2.0 语法 常量变量
- view,control,service,dao,model层的关系
- Android之ProgressBar读取文件进度解析