本篇所列题目中有关矩阵(数组)的关键点主要在于找行列规律 可以从行号+-列号 或总和中去找 在代码中自行体会
acwing749 数组上方区域
#include<cstdio>
using namespace std;
int main()
{
char t;
scanf("%c",&t);
double a[12][12];
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
scanf("%lf",&a[i][j]);
int c=0;
double s=0;
for(int i=0;i<5;i++)
for(int j=i+1;j<=10-i;j++) //根据行数判断起终点
{
c++;
s+=a[i][j];
}
if(t=='S') printf("%.1f\n",s);
else printf("%.1lf\n",s/c);
return 0;
}
acwing753 平方数组 关键思路 判断一点到最外层的最小值
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n,n)//这里的while写法很巧妙
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int up=i,down=n-i+1,left=j,right=n-j+1;//上下左右四个点的距离
cout<<min(min(up,down),min(left,right))<<' '; //找出四个数的最小值
//即为需要再矩阵中填充的数字
}
cout<<endl;
}
cout<<endl;
}
}
acwing740 数组变换 还可以用之前用过的reverse进行数组翻转
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[20],b[20];
for(int i=0;i<20;i++) cin>>a[i];
for(int i=19,j=0;i>=0;i--,j++) b[j]=a[i];//for循环中两个变量很巧妙
for(int i=0;i<20;i++) printf("N[%d]=%d\n",i,b[i]);
return 0;
}
acwing741 斐波那契数列
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
long long f[61]; //小心整数溢出
f[0]=0,f[1]=1;
for(int i=2;i<=60;i++) f[i]=f[i-1]+f[i-2];
int n;
cin>>n;
while(n--)
{
int x;
cin>>x;
printf("Fib(%d)=%lld\n",x,f[x]);
}
return 0;
}
acwing742 找最小数
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int a[100];
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int p=0;
for(int i=1;i<n;i++) // 判断最小
if(a[i]<a[p])
p=i;
printf("Minimum value:%d\n",a[p]);
printf("Postion: %d\n",p);
return 0;
}
acwing744 数组中的列
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int c;
char t;
double q[12][12];
cin>>c>>t;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin>>q[i][j];
double s=0;
for(int i=0;i<12;i++) s+=q[i][c];
if(t=='S') printf("%.1lf\n",s);
else printf("%.1lf\n",s/12);
return 0;
}
acwing748数组的右下部分
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char t;
cin>>t;
double q[12][12];
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin>>q[i][j];
double s=0,c=0;
for(int i=1;i<=11;i++)
for(int j=12-i;j<=11;j++)
{
s+=q[i][j];
c+=1;
}
if(t=='S') printf("%.1f\n",s);
else printf("%.1lf\n",s/c);
return 0;
}
acwing746 数组的左下部分
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char t;
cin>>t;
double q[12][12];
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin>>q[i][j];
double s=0,c=0;
for(int i=0;i<12;i++)
for(int j=0;j<i;j++)
{
s+=q[i][j];
c+=1;
}
if(t=='S') printf("%.1f\n",s);
else printf("%.1lf\n",s/c);
return 0;
}
acwing750 数组的下方区域
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char t;
cin>>t;
double q[12][12];
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin>>q[i][j];
double s=0,c=0;
for(int i=7;i<=11;i++)
for(int j=12-i;j<=i-1;j++)
{
s+=q[i][j];
c+=1;
}
if(t=='S') printf("%.1lf\n",t);
else printf("%.1lf\n",s/c);
return 0;
}
acwing752 数组的右方区域
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
char t;
cin>>t;
double q[12][12];
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin>>q[i][j];
double s=0,c=0;
for(int i=1;i<=5;i++)
for(int j=12-i;j<=11;j++)
{
s+=q[i][j];
c+=1;
}
for(int i=6;i<=10;i++)
for(int j=i+1;j<=11;j++)
{
s+=q[i][j];
c+=1;
}
if(t=='S') printf("%.1lf\n",s);
else printf("%.1lf",s/c);
return 0;
}
acwing754 平方矩阵II 观察坐标和数字的关系
#include<iostream>
using namespace std;
int main()
{
int n, a[110][110];
while(cin >> n, n)
{
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
a[i][j] = abs(i - j) + 1;
}
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ ) cout << a[i][j] << ' ';
cout << endl;
}
cout << endl;
}
return 0;
}
acwing 755平方矩阵III
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
while(cin>>n,n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int v=1;
for(int k=0;k<i+j;k++) v*=2;
cout<<v<<' ';
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
acwing756 蛇形矩阵 蓝桥真题 偏移量技巧
#include<iostream>
using namespace std;
int res[100][100];
int main()
{
int n,m;
cin>>n>>m;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
for(int x=0,y=0,d=0,k=1;k<=n*m;k++)
{
res[x][y]=k;
int a=x+dx[d],b=y+dy[d];
if(a<0||a>=n||b<0||b>=m||res[a][b])
{
d=(d+1)%4;
a=x+dx[d],b=y+dy[d];
}
x=a,y=b;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++) cout<<res[i][j]<<' ';
cout<<endl;
}
return 0;
}
字符串从指定序号输出
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
char a2[]={'A','B','C','\0'};
char a3[]="ABCDEF";
cout<<a2+1<<endl;//从序号0开始 想从第几个序号输出就在数组名后加上几
printf("%s\n",a3+2);
return 0;
}
读入 与输出相同
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char s[100];
cin>>s+1;
cout<<s<<endl;
return 0;
}
fgets函数 读入一行字符穿到字符数组里
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
char s[100];
char p[100];
fgets(s,100,stdin);
fgets(p,100,stdin);
cout<<s<<endl;
cout<<p<<endl;
return 0;
}
getline用法 但不输出空格
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
string s;
string p;
getline(cin,s);
getline(cin,p);
cout<<s<<endl;
cout<<p<<endl;
return 0;
}
fgets函数 读入一行字符穿到字符数组里 读入的回车也会被输出
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
char s[100];
char p[100];
fgets(s,100,stdin);
fgets(p,100,stdin);
cout<<s<<endl;
cout<<p<<endl;
return 0;
}