【矩阵】牛客 C翻转(矩阵翻转)、矩阵幂、计算两个矩阵的乘积、乙1068 万绿丛中一点红(处理八个方向)

题目描述

首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。 操作类型有四种:  1 2 表示:90度,顺时针,翻转4个数  1 3 表示:90度,顺时针,翻转9个数  2 2 表示:90度,逆时针,翻转4个数  2 3 表示:90度,逆时针,翻转9个数 

输入描述:

输入有多组数据。
每组输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。

输出描述:

输出翻转后的数组。

示例1

输入

复制

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
1 3 1 1

输出

复制

11 6 1 4 5
12 7 2 9 10
13 8 3 14 15
16 17 18 19 20
21 22 23 24 25

 

 

题目描述

给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。

输入描述:

 
第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。
接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证最后结果不会超过10^8。

输出描述:

对于每组测试数据,输出其结果。格式为:
n行n列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。

示例1

输入

复制

2 2
9 8
9 3

输出

复制

153 96
108 81

#include <stdio.h>
#include <cstdio>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
using namespace std;
void Pow(int result[11][11],int a[11][11],int n)
{
    int tmp[11][11];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            tmp[i][j]=0;
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            for(int k=0;k<n;k++)
            {
                tmp[i][j]+=result[i][k]*a[k][j];
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            result[i][j]=tmp[i][j];
        }
    }
}
int main(){
    int n,k;
    scanf("%d %d",&n,&k);
    int a[11][11];
    int result[11][11];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
            result[i][j]=a[i][j];
        }
    }
    for(int i=0;i<k-1;i++)
    {
        Pow(result,a,n);
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(j==0)
            printf("%d",result[i][j]);
            else
            printf(" %d",result[i][j]);
        }
        printf("\n");
    }
}

 

题目描述

https://www.nowcoder.com/practice/ed6552d03e624ba58d16af6d57e1c3e9?tpId=40&tqId=21502&tPage=9&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking

计算两个矩阵的乘积,第一个是2*3,第二个是3*2

输入描述:

输入为两个矩阵,其中一个为2*3的矩阵,另一个为3*2的矩阵

输出描述:

一个2*2的矩阵(每一个数字后都跟一个空格)

示例1

输入

复制

1 2 3
3 4 5
6 7
8 9
10 11

输出

复制

52 58
100 112

#include <stdio.h>
#include <cstdio>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
using namespace std;
int main(){
    int a[2][3],b[3][2],c[2][2];
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<2;j++)
        {
            scanf("%d",&b[i][j]);
        }
    }
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            c[i][j]=0;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            for(int k=0;k<3;k++)
            {
                c[i][j]+=a[i][k]*b[k][j];
            }
        }
    }
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            printf("%d ",c[i][j]);
        }
       // printf("2");
        printf("\n");
    }
}

 

1068 万绿丛中一点红 (20 分)

对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。

输入格式:

输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,2​24​​) 内。所有同行数字间用空格或 TAB 分开。

输出格式:

在一行中按照 (x, y): color 的格式输出所求像素点的位置以及颜色值,其中位置 xy 分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique;如果这样的点不存在,则输出 Not Exist

输入样例 1:

8 6 200
0 	 0 	  0 	   0	    0 	     0 	      0        0
65280 	 65280    65280    16711479 65280    65280    65280    65280
16711479 65280    65280    65280    16711680 65280    65280    65280
65280 	 65280    65280    65280    65280    65280    165280   165280
65280 	 65280 	  16777015 65280    65280    165280   65480    165280
16777215 16777215 16777215 16777215 16777215 16777215 16777215 16777215

输出样例 1:

(5, 3): 16711680

输入样例 2:

4 5 2
0 0 0 0
0 0 3 0
0 0 0 0
0 5 0 0
0 0 0 0

输出样例 2:

Not Unique

输入样例 3:

3 3 5
1 2 3
3 4 5
5 6 7

输出样例 3:

Not Exist

#include <stdio.h>
#include <cstdio>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
using namespace std;
int m,n,tol;
int a[1001][1001];
int go[][2]={  //8个相邻点与当前位置的坐标差
    {-1,-1},
    {-1,0},
    {-1,1},
    {0,1},
    {1,1},
    {1,0},
    {1,-1},
    {0,-1}
};
bool outBound(int i,int j)
{
    if(i<0||j<0||i>=n||j>=m)
    {
        return true;
    }
    return false;
}
bool f(int i,int j)  //阙值是否超过tol
{
    for(int k=0;k<8;k++)
    {
        int nx=i+go[k][0];
        int ny=j+go[k][1];
        if(!outBound(nx,ny))
        {
            if(abs(a[i][j]-a[nx][ny])<=tol)
                return false;
        }
    }
    return true;
}
int main(){
    scanf("%d %d %d",&m,&n,&tol);
    map<int,int>mmap;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%d",&a[i][j]);
            mmap[a[i][j]]++;
        }
    }
    int cnt=0;
    int a1,b1,c1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(f(i,j)==true)
            {
                if(mmap[a[i][j]]==1)
                {
                    a1=i;
                    b1=j;
                    c1=a[i][j];
                    cnt++;
                }
            }
            // printf("%d ",mmap[a[i][j]]);
        }
    }
    if(cnt==0)
        printf("Not Exist\n");
    else if(cnt==1)
        printf("(%d, %d): %d",b1+1,a1+1,c1);
    else
        printf("Not Unique\n");
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值