首先,抱歉拖更了1个多月,其次,为了让程序的结构更加明确,我将会把代码写得更紧凑些,希望不影响观看,谢谢。。。
目录
一、认识二维数组及其特点
一维数组只是一条数据,不能进行分类或表示更多意义。二维数组则是一张表格,可以存储分类跟多数据,意义也随之增加。
定义:数据类型(typename) 数组名[行数][列数],……,……;
和一维数组相比只是多了一个[行数]。
一定要注意:二维数组的下标一般用“数对”表示,不过是先行后列!先行后列!先行后列!(重要的事情说三遍),如上图。还有,二维数组的下标也是从0开始(也可以忽略第0行,或第0列)。
一般输入时,要先输入行数和列数(n和m),输入输出时,二维数组就要用双重循环:
注意!二维数组做函数参数时要这么写:
二、学会分析下标之间的关系
先是一道例题。。。
输入一个行数,再输入两个正方形数组a和b。判断如果a数组等于b数组,输出0;如果a数组向右旋转90°等于b数组,则输出1;如果a数组向右旋转180°等于b数组,则输出2;如果a数组向右旋转270°等于b数组,则输出3;否则都不满足,则输出-1。
代码:
这道题的关键就是要做到向右旋转。下标之间一定是有关系的,我们如何知道它们之间的关系,可以用“代入模拟法”(自己取的)。
变化如下:
所以,
向右旋转180°、270°的方法也可以用“代入模拟法”做出来,当然也可以看成旋转2或3次90°(时间复杂度可能会比较高)。
代码:
最后用main函数调用一下:
OK啦!!!
代码:
#include<bits/stdc++.h>
using namespace std;
void input(int a[][25],int n){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
}
bool check1(int a[][25],int b[][25],int n){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]!=b[i][j])
return 0;
return 1;
}
bool check2(int a[][25],int b[][25],int n){
int c[25][25];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[j][n-i+1]=a[i][j];
if(check1(c,b,n))
return 1;
return 0;
}
bool check3(int a[][25],int b[][25],int n){
int c[25][25];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-i+1][n-j+1]=a[i][j];
if(check1(c,b,n))
return 1;
return 0;
}
bool check4(int a[][25],int b[][25],int n){
int c[25][25];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-j+1][i]=a[i][j];
if(check1(c,b,n))
return 1;
return 0;
}
int main(){
int a[25][25],b[25][25];
int n;
cin>>n;
input(a,n);
input(b,n);
if(check1(a,b,n))
cout<<0;
else if(check2(a,b,n))
cout<<1;
else if(check3(a,b,n))
cout<<2;
else if(check4(a,b,n))
cout<<3;
else
cout<<-1;
return 0;
}