noi寒假刷题之旅_ 1.8编程基础之多维数组(25题)
»1.8编程基础之多维数组(25题)
上次编辑的时候忘记保存了,前面几题就算了趴懒得
08:矩阵加法
#include<iostream> #define MAX 105 using namespace std; int table[MAX][MAX]; int main() { int n,m; cin>>n>>m; for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>table[i][j]; int t; for(int i=0;i<n;++i) { for(int j=0;j<m;++j) { cin>>t; if(j==0) { cout<<table[i][j]+t; } else { cout<<' '<<table[i][j]+t; } } cout<<endl; } return 0; }
09:矩阵乘法
#include<iostream> #define MAX 105 using namespace std; int table1[MAX][MAX]; int table2[MAX][MAX]; int table3[MAX][MAX]; int main() { int n,m,k; cin>>n>>m>>k; for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>table1[i][j]; for(int i=0;i<m;++i)for(int j=0;j<k;++j)cin>>table2[i][j]; int t; for(int i=0;i<n;++i) { for(int j=0;j<k;++j) { for(int z=0;z<m;++z)table3[i][j] += table1[i][z]*table2[z][j]; } } for(int i=0;i<n;++i) { for(int j=0;j<k;++j) { if(j!=0) { cout<<" "<<table3[i][j]; } else { cout<<table3[i][j]; } } cout<<endl; } return 0; }
10:矩阵转置
#include<iostream> #define MAX 105 using namespace std; int table1[MAX][MAX]; int main() { int n,m,k; cin>>n>>m; for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>table1[i][j]; for(int i=0;i<m;++i) { for(int j=0;j<n;++j) { if(j!=0) { cout<<" "<<table1[j][i]; } else { cout<<table1[j][i]; } } cout<<endl; } return 0; }
11:图像旋转
#include<iostream> #define MAX 105 using namespace std; int table1[MAX][MAX]; int main() { int n,m,k; cin>>n>>m; for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>table1[i][j]; for(int i=0;i<m;++i) { for(int j=n-1;j>=0;--j) { if(j!=n-1) { cout<<" "<<table1[j][i]; } else { cout<<table1[j][i]; } } cout<<endl; } return 0; }
12:变幻的矩阵
#include<iostream> #include<string> #define MAX 105 using namespace std; string table1[MAX][MAX]; string table2[MAX][MAX]; int main() { int n; cin>>n; for(int i=0;i<n;++i)for(int j=0;j<n;++j)cin>>table1[i][j]; for(int i=0;i<n;++i)for(int j=0;j<n;++j)cin>>table2[i][j]; int flag=0; for(int i=0,ii=0;i<n;++i,++ii) { for(int j=n-1,jj=0;j>=0;--j,++jj) { if(table1[j][i]!=table2[ii][jj]) { flag=1; } } } if(flag) { flag=0; for(int i=n-1,ii=0;i>=0;--i,++ii) { for(int j=0,jj=0;j<n;++j,++jj) { if(table1[j][i]!=table2[ii][jj]) { flag=1; } } } if(flag) { flag=0; for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { if(table1[i][j]!=table2[i][j]) { flag=1; } } } if(flag) { flag=0; for(int i=n-1,ii=0;i>=0;--i,++ii) { for(int j=n-1,jj=0;j>=0;--j,++jj) { if(table1[i][j]!=table2[ii][jj]) { flag=1; } } } if(flag) { cout<<5; } else { cout<<3; } } else { cout<<4; } } else { cout<<2; } } else { cout<<1; } return 0; }
13:图像模糊处理【四舍五入取上整】
#include<iostream> #include<cmath> #define MAX 105 using namespace std; double table1[MAX][MAX]; double table2[MAX][MAX]; int main() { int n,m; cin>>n>>m; for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>table1[i][j]; int flag=0; for(int i=0;i<n;++i) { for(int j=0;j<m;++j) { if(!(i==0||j==0||i==n-1||j==m-1)) { table2[i][j]=((table1[i][j]+table1[i-1][j]+table1[i+1][j]+table1[i][j+1]+table1[i][j-1])/5); } else { table2[i][j] = table1[i][j]; } } } for(int i=0;i<n;++i) { for(int j=0;j<m;++j) { if(j==0)printf("%.0f",table2[i][j]); else printf(" %.0f",table2[i][j]); } cout<<endl; } return 0; }
两种四舍五入的方式
#include<iostream> using namespace std; int main() { double a=5.12; double b=4.55; /* printf()函数会根据格式要求(%.nf)自动对float类型小数进行四舍五入,输出到小数点后面的第n位,第n+1位进行“四舍五入” */ printf("1:四舍:%.0f,五入:%.0f\n",a,b); printf("2:四舍:%d,五入:%d\n",int(a+0.5),int(b+0.5)); }
14:扫雷游戏地雷数计算
#include<iostream> #include<string> #include<cmath> #define MAX 105 using namespace std; char table1[MAX][MAX]={}; int table2[MAX][MAX]={}; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)cin>>table1[i][j]; int flag=0; for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(table1[i][j]=='*') { table2[i][j]=-1; } else { table2[i][j]=(table1[i-1][j]=='*')+(table1[i+1][j]=='*')+(table1[i][j-1]=='*')+(table1[i][j+1]=='*')+(table1[i-1][j-1]=='*')+(table1[i+1][j+1]=='*')+(table1[i-1][j+1]=='*')+(table1[i+1][j-1]=='*'); } } } for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(table2[i][j]==-1)cout<<"*"; else cout<<table2[i][j]; } cout<<endl; } return 0; }
15:细菌的繁殖与扩散
#include<iostream> #include<string> #include<cmath> #include<cstring> #define MAX 105 using namespace std; int table[MAX][MAX]={}; int table2[MAX][MAX]={}; int dx[]={1,1,1,0,0,-1,-1,-1}; //从上到下 int dy[]={-1,0,1,-1,1,-1,0,1}; //从上到下 int main() { int n,m; cin>>table[5][5]>>m; for(int i=1;i<=m;++i) { for(int j=1;j<=9;++j) { for(int k=1;k<=9;++k) { table2[j][k]+=table[j][k]*2; for(int s=0;s<8;++s) { int x=j+dx[s],y=k+dy[s]; table2[x][y]+=table[j][k]; } } } memcpy(table,table2,sizeof(table2)); memset(table2,0,sizeof(table2)); } for(int j=1;j<=9;++j) { for(int k=1;k<=9;++k) { if(k==1) cout<<table[j][k]; else cout<<" "<<table[j][k]; } cout<<endl; } return 0; }
16:矩阵剪刀石头布
#include<iostream> #include<string> #include<cmath> #include<cstring> #define MAX 105 using namespace std; char table[MAX][MAX]; char table2[MAX][MAX]; int dx[]={-1,1,0,0}; //从上到下 int dy[]={0,0,-1,1}; //从上到下 char f(char a,char b) { if(a=='R'&&b=='S'||a=='S'&&b=='P'||a=='P'&&b=='R') return a; else return 'N'; } int main() { int r,c,n; cin>>r>>c>>n; for(int i=1;i<=r;++i)for(int j=1;j<=c;++j)cin>>table[i][j]; memcpy(table2,table,sizeof(table)); for(int i=0;i<n;++i) { for(int j=1;j<=r;++j) { for(int k=1;k<=c;++k) { for(int s=0;s<4;++s) { int x=j+dx[s],y=k+dy[s]; char r=f(table[j][k],table[x][y]); if(r!='N') table2[x][y]=r; } } } memcpy(table,table2,sizeof(table2)); } for(int i=1;i<=r;++i) { for(int j=1;j<=c;++j) { cout<<table[i][j]; } cout<<endl; } return 0; }
17:最好的草
#include<iostream> #include<string> #include<cmath> #include<cstring> #define MAX 105 using namespace std; char table[MAX][MAX]; int dx[]={-1,1,0,0}; //从上到下 int dy[]={0,0,-1,1}; //从上到下 int main() { int r,c,n,conut=0; cin>>r>>c; for(int i=1;i<=r;++i)for(int j=1;j<=c;++j) cin>>table[i][j]; for(int j=1;j<=r;++j) for(int k=1;k<=c;++k) { if(table[j][k]=='#') { conut++; for(int s=0;s<4;++s) { int x=j+dx[s],y=k+dy[s]; if(table[x][y]=='#') table[x][y]='.'; } } } cout<<conut; return 0; }
18:肿瘤面积【算面积,还差两个点老是wa,所以贴一份dalao的ac代码,写的相当清晰】
#include <iostream> using namespace std; int main() { int n, low, high,x1 ,y1,x2,y2,sum; cin>>n; int i=0; while(i<n*n){ int num; cin>>num; if(num==0){ low=i; i++; break; } i++; } while(i<n*n){ int num; cin>>num; if(num==0){ high=i; } i++; } x1=low%n;y1=(low+n)/n; x2=high%n;y2=(high+n)/n; sum=(y2-y1-1)*(x2-x1-1); cout<<sum<<endl; return 0; }
19:肿瘤检测
#include<iostream> #include<string> #include<cmath> #include<cstring> #define MAX 1004 using namespace std; int table[MAX][MAX]; int n; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; int main() { int s=0,c=0; cin>>n; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { cin>>table[i][j]; if(table[i][j]<=50)s++; } for(int j=1;j<=n;++j) { for(int k=1;k<=n;++k) { if(table[j][k]<=50) { if(j==1||k==1||j==n||k==n) { c++; } else { for(int i=0;i<4;++i) { int x=dx[i]+j,y=dy[i]+k; if(table[x][y]>50) { c++; break; } } } } } } cout<<s<<" "<<c; return 0; }
20:反反复复
#include<iostream> #include<string> #include<cmath> #include<cstring> #define MAX 1004 using namespace std; char table[MAX][MAX]; int n; int main() { int s=0,c=0,ii=0; string str=""; cin>>n>>str; int len=str.length(); len = len/n; for(int i=0;i<len;++i) { if(i%2==1) { for(int j=n-1;j>=0;--j) { table[i][j] = str[ii++]; } } else { for(int j=0;j<n;++j) { table[i][j] = str[ii++]; } } } for(int i=0;i<n;++i) { for(int j=0;j<len;++j) { cout<<table[j][i]; } } return 0; }
21:二维数组右上左下遍历
#include<iostream> #include<string> #include<cmath> #include<cstring> #include<algorithm> #define MAX 1004 using namespace std; int table[MAX][MAX]; int n; int main() { int row,col,solt=0; cin>>row>>col; for(int i=0;i<row;++i) for(int j=0;j<col;++j) cin>>table[i][j]; for(int k=0;k<=row+col;++k) for(int i=0;i<row;++i) for(int j=0;j<col;++j) { if(i+j==k)cout<<table[i][j]<<endl; } return 0; }
22:神奇的幻方
#include<iostream> #include<string> #include<cmath> #include<cstring> #include<algorithm> #define MAX 1004 using namespace std; int t[MAX][MAX]; int main() { int n; cin>>n; int m=(2*n-1); int x=1,y=n; t[x][y]=1; //第一个数字写在第一行的中间 for(int i=2;i<=m*m;++i) { if(x==1&&y==m||t[x-1][y+1]) x+=1;//c else if(x==1) x=m,y+=1;//a else if(y==m) x-=1,y=1;//b else x-=1,y+=1;//下一个数字,都写在上一个数字的右上方 t[x][y]=i; } for(int i=1;i<=m;++i) { for(int j=1;j<=m;++j) { cout<<t[i][j]<<" "; } cout<<endl; } return 0; }
23:二维数组回形遍历
【没什么技术含量就是麻烦的要死,辛辛苦苦写了个递归然后爆掉了,果断该循环】
#include<iostream> #include<string> #include<cmath> #include<cstring> #include<algorithm> #define MAX 1004 using namespace std; int t[MAX][MAX]; int v[MAX][MAX]; int main() { int srow=0,scol=0,row,col;cin>>row>>col; for(int i=0;i<row;++i)for(int j=0;j<col;++j)cin>>t[i][j]; int si=0,sj=0; for(int i=1;i<=row*col;++i,++srow,++scol,--row,--col) { for(int i=scol;i<col&&!v[srow][i];++i) { cout<<t[srow][i]<<endl; v[srow][i]=1; } for(int i=srow+1;i<row&&!v[i][col-1];++i) { cout<<t[i][col-1]<<endl; v[i][col-1]=1; } for(int i=col-2;i>scol&&!v[row-1][i];--i) { cout<<t[row-1][i]<<endl; v[row-1][i]=1; } for(int i=row-1;i>srow&&!v[i][scol];--i) { cout<<t[i][scol]<<endl; v[i][scol]=1; } } return 0; }
测试数据
4 5 1 2 3 4 11 12 13 14 5 111 11 16 15 6 1111 10 9 8 7 11111 5 4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 17 18 19 20 1 2 1 2 4 4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 1 1 1
24:蛇形填充数组
#include<iostream> #include<string> #include<cmath> #include<cstring> #include<algorithm> #define MAX 1004 using namespace std; int t[MAX][MAX]; int v[MAX][MAX]; int main() { int n,num=1;cin>>n; for(int k=0;k<=2*n;++k) { if(k%2) { for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { if(i+j==k) t[i][j]=num++; } } } else { for(int i=n-1;i>=0;--i) { for(int j=0;j<n;++j) { if(i+j==k) t[i][j]=num++; } } } } for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { cout<<t[i][j]<<" "; } cout<<endl; } return 0; }
25:螺旋加密
#include<iostream> #include<string> #include<cmath> #include<cstring> #include<algorithm> #define MAX 1004 using namespace std; int t[MAX][MAX]; int v[MAX][MAX]; string table[27]={"00000","00001","00010","00011","00100", "00101","00110","00111","01000","01001","01010","01011", "01100","01101","01110","01111","10000","10001","10010", "10011","10100","10101","10110","10111","11000","11001","11010"}; string MakeCode(string str,int len) { string re=""; for(int i=0;i<str.length();++i) { for(int j=0;j<27;++j) { if(str[i]==' ') { re+=table[0];break; } else { re+=table[str[i]-'A'+1]; break; } } } return re; } int main() { string str; int srow=0,scol=0,row,col,ii=0; cin>>row>>col;getchar();getline(cin,str); int r=row,c=col; string num=MakeCode(str,row*col); for(int ii=0;ii<num.length();++srow,++scol,--row,--col) { for(int i=scol;i<=col-1&&!v[srow][i]&&ii<num.length();++i,++ii) { t[srow][i]=num[ii]-'0'; v[srow][i]=1; } for(int i=srow+1;i<=row-1&&!v[i][col-1]&&ii<num.length();++i,++ii) { t[i][col-1]=num[ii]-'0'; v[i][col-1]=1; } for(int i=col-2;i>=scol&&!v[row-1][i]&&ii<num.length();--i,++ii) { t[row-1][i]=num[ii]-'0'; v[row-1][i]=1; } for(int i=row-2;i>=srow+1&&!v[i][scol]&&ii<num.length();--i,++ii) { t[i][scol]=num[ii]-'0'; v[i][scol]=1; } } for(int i=0;i<r;++i) for(int j=0;j<c;++j) cout<<t[i][j]; return 0; }