1.初始化(可以省略行,不可以省略列
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr[3][4]={1,2,3,4,5,6,7};
int arr[3][4]={ {1,2},{3,4},{4,5} };
二维数组在内存中是连续存放的;一行内部连续,跨行也是连续的。
也解释了为什么列不能省略,要知道从哪开始放第二行,而行数可以省略,只要把这样元素放完即可。
**数组为什么要开大一点
如右图所示就算是越界访问了
对角线数字不改变 观察对角线上方数字 行标小于列标
#include
int main()
{
int a[][3] =
{
8,1,6,3,5,7,4,9,2
};
for(int i=0;i<3;i++){
for(int j=1+i;j<3;j++){
//交换a[i][j] a[j][i]
int t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
for(int i=0;i<3;i++ ){
for(int j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
思路参考csdn搜到的想法
//F:旋转矩阵
#include
int main()
{
int a[4][4],b[4][4];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
scanf("%d",&a[i][j]);
}
}
//交换1 3行
for(int i=0;i<3;i++){
int t=a[0][i];
a[0][i]=a[2][i];
a[2][i]=t;
}
//再矩阵转置
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
int t=a[i][j];
a[i][j]=b[j][i];
b[j][i]=t;
}
}
for(int j=0;j<3;j++){
for(int i=0;i<3;i++){
printf("%d ",b[j][i]);
}
printf("\n");
}
return 0;
}
按圈填数,一圈4条边(用j来表示)
一定要注意边界!!!
上边:从左到右, 第i行, 列数j从i到n-i,输出a[i][j]
右边:从上到下,第n-i+1列,行数j从i到n-i,输出a[j][n-i]
下边:从右到左,第n-i+1行,列数j从n-i+1到i+1,输出a[n-i+1][j]
左边:从下到上,第i列,行数j从n-i+1到i+1,输出a[j][i]
#include
int main()
{
int n,a[15][15];
scanf("%d",&n);
for(int i=1;i<=n;i++){//圈数和输入的n有关,奇数情况还漏掉了一个最中心的元素
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n/2;i++){
//最上边
for(int j=i;j<=n-i;j++){
printf("%d\n",a[i][j]);
}
//最右边
for(int j=i;j<=n-i;j++){
printf("%d\n",a[j][n-i+1]);
}
//最下边
for(int j=n-i+1;j>=i+1;j--){
printf("%d\n",a[n-i+1][j]);
}
//最左边
for(int j=n-i+1;j>=i+1;j--){
printf("%d\n",a[j][i]);
}
}
if(n%2==1){//奇数情况
printf("%d",a[n/2+1][n/2+1]);
}
return 0;
}
intd[x]={0,1(行数加一),0,-1};//行偏移(右下左上)
intd[y]={1,0,-1,0}//列偏移
起始位置:x=1,y=1(第一行第一列开始),方向参数m=0
周期为4,m=m+1
何时拐弯?
看到0就拐弯,访问过的数全部变成0