T1 孤独的素数
说明
在一个n行m列的矩阵王国中,生活着一些整数,其中一些是素数,一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数,我们就认为这是一个孤独的素数。
比如:一个3行5列的矩阵如下。
3 8 10 9 5
6 10 2 4 13
8 8 9 6 3
这个矩阵中有2个素数,分别是第1行第1列的3,和第2行第3列的2。
请编程计算出,一个n行m列的矩阵中有多少个孤独的素数?
输入格式
第1行有2个整数n和m,代表矩阵的大小(3<=n,m<=50)
接下来n行,每行有m个整数(这些整数是1~1000之间的整数,含1和1000)
输出格式
输出1个整数,代表矩阵中孤独素数的个数。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[60][60];
int k=0;
bool isp(int x)
{
int b=1;
int i=2;
while(i*i<=x&&b==1)
if(x%i==0)b=0;
else i++;
if(x<=1)b=0;
return b;
}
bool udlr(int c,int r)
{
int b=1;
if(isp(a[c-1][r])==1)b=0;
if(isp(a[c+1][r])==1)b=0;
if(isp(a[c][r-1])==1)b=0;
if(isp(a[c][r+1])==1)b=0;
if(isp(a[c-1][r-1])==1)b=0;
if(isp(a[c+1][r+1])==1)b=0;
if(isp(a[c+1][r-1])==1)b=0;
if(isp(a[c-1][r+1])==1)b=0;
return b;
}
int main()
{
cin>>n>>m;
for(int c=1;c<=n;c++)
for(int r=1;r<=m;r++)
cin>>a[c][r];
for(int c=1;c<=n;c++)
for(int r=1;r<=m;r++)
if(isp(a[c][r])==1&&udlr(c,r)==1)k++;
cout<<k;
return 0;
}
T2 找朋友
说明
小T喜欢和自己同龄的人交朋友,现在他排在了一个n行m列的队伍中。请问在小T所在的行和小T所在的列中,他一共能交到几个朋友?
比如:一个6行6列的矩阵如下,该矩阵中每个数字代表了一个同学的年龄。
8 | 9 | 7 | 9 | 5 | 3 |
2 | 9 | 15 | 9 | 9 | 12 |
21 | 3 | 4 | 6 | 7 | 9 |
10 | 10 | 8 | 2 | 3 | 6 |
5 | 4 | 2 | 9 | 5 | 10 |
9 | 11 | 2 | 9 | 5 | 7 |
假设小T在第2行第4列,也就是他的年龄是9岁,他所在的第2行除了小T还有2个人9岁,他所在的列除了小T有3个人是9岁,因此他可以交到5个朋友。
输入格式
第1行有2个整数n和m,分别代表队形的行和列的值(2<=n,m<=200)
接下来n行,每行有m个整数,代表每个同学的年龄(每个同学的年龄的值在1~100之间)
接下来最后一行有2个整数,代表小T在第几行第几列。
输出格式
输出一个整数,代表小T可以交到的朋友的数量。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a[200][200],x,y,s=0;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cin>>a[i][j];
}
cin>>x>>y;
x--,y--;
for(int i=0;i<m;i++)
{
if(a[x][i]==a[x][y])
s++;
}
for(int i=0;i<n;i++)
{
if(a[i][y]==a[x][y])
s++;
}
cout<<s-2;
return 0;
}
T3 操场换位置
说明
同学们在操场上排成了一个n行m列的队形,请将这个队形中,年龄最大的同学和年龄最小的同学交换位置,并输出交换的结果(若有多个年龄最大的同学,优先选择第一个出现的,若有多个年龄最小的同学,优先选择最后出现的)
比如:如下是一个3行4列的队形,这个队形中每个数字代表了每个同学的年龄。
8 10 18 9
15 12 10 6
17 3 12 15
这个队形中,年龄最大的同学在第1行第3列,年龄最小的同学在第3行第2列,将他们交换位置后输出结果为:
8 10 3 9
15 12 10 6
17 18 12 15
输入格式
第1行有2个整数n和m,分别代表队形的行和列的值(2<=n,m<=200)
接下来n行,每行有m个整数,代表每个同学的年龄(每个同学的年龄的值在1~100之间)
输出格式
输出n行m列,代表交换位置后的结果,每行的m个数之间用空格隔开。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x,y,z[210][210],maxz=INT_MIN,minz=INT_MAX;
scanf("%d%d",&x,&y);
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
scanf("%d",&z[i][j]);
if(z[i][j]>maxz)
maxz=z[i][j];
if(minz>z[i][j])
minz=z[i][j];
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
if(z[i][j]==maxz)
cout<<minz<<' ';
else if(minz==z[i][j])
cout<<maxz<<' ';
else cout<<z[i][j]<<' ';
}
printf("\n");
}
return 0;
}
T16 两个数相邻吗?
说明
同学们在操场上排成了一个n行m列的队形,假设这个队形中所有人年龄都不同,那么给定2个年龄后,请你编程判断,这2个年龄对应的同学是否相邻?
相邻的定义是:如果两个同学在上下左右的位置是挨在一起的,那么就算是相邻的。
比如:如下是一个3行4列的队形,这个队形中每个数字代表了每个同学的年龄。
8 2 3 4
5 6 7 1
9 10 11 12
那么这个队形中,年龄6和年龄10两个值就是相邻的。
输入格式
第1行有2个整数n和m,分别代表队形的行和列的值(2<=n,m<=200)
接下来n行,每行有m个整数,代表每个同学的年龄(每个同学的年龄的值在1~100之间)
最后一行输入2个整数,代表2个不同年龄的值。
输出格式
如果两个年龄的值是相邻的,请输出字符Y,否则请输出字符N。
#include <iostream>
using namespace std;
int n,m,arr[210][210];
int x,y;
bool neigh(int i,int j)
{
if(arr[i+1][j]==y)return 1;
else if(arr[i-1][j]==y)return 1;
else if(arr[i][j+1]==y)return 1;
else if(arr[i][j-1]==y)return 1;
else return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>arr[i][j];
}
}
cin>>x>>y;
bool flag;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(x==arr[i][j])
{
flag=neigh(i,j);
}
}
}
if(flag)cout<<'Y';
else cout<<'N';
return 0;
}