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

 

题目描述

有一副由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;
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值