知识点:找规律+指针模拟
PS:其实这道题很简单,但看到很多大牛用了很多比较复杂的方法,所以贴上来大家切磋切磋。
问题描述:
旋转矩阵
Time Limit:1000MS Memory Limit:65536K
Total Submit:59 Accepted:31
Description
把前n*n个正整数1,2,...,n*n 从左上角开始,由外层至中心按顺时针方向螺旋排列所成的数字矩阵,旋转成由中心向外层按照顺时针方向螺旋排列成的数字矩阵。
Input
输入一个正整数n(1~20)。
Output
输出旋转前后的两个n阶矩阵,两个矩阵之间用插入一个空行。矩阵中的元素设置宽度为3。
Sample Input
3Sample Output
1 2 3
8 9 4
7 6 5
9 2 3
8 1 4
7 6 5
//我的代码:
#include<cstdio>
int main()
{
int n;
scanf("%d",&n);
int a[n][n],tmp=1,max=n*n; //max为矩阵中最大值
/*i、j代表行和列,p1、p2代表最上行数和最下行数,q1、q2代表最左列数和
最右列数
*/
int i=0,j,p1=0,p2=n-1,q1=-1,q2=n-1;
while(1)
{
for(j=q1+1;j<=q2;j++)
a[i][j]=tmp++;
j--,q1++;
for(i=p1+1;i<=p2;i++)
a[i][j]=tmp++;
i--,p1++;
if(a[i][j]==max) break;
for(j=q2-1;j>=q1;j--)
a[i][j]=tmp++;
j++,q2--;
for(i=p2-1;i>=p1;i--)
a[i][j]=tmp++;
i++,p2--;
if(a[i][j]==max) break;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%3d",a[i][j]);
putchar('\n');
}
putchar('\n');
tmp=n*n;
if(n%2)
{
j=0,p1=-1,p2=n-1,q1=0,q2=n-1;
while(1)
{
for(i=p1+1;i<=p2;i++)
a[i][j]=tmp--;
i--,p1++;
for(j=q1+1;j<=q2;j++)
a[i][j]=tmp--;
j--,q1++;
if(a[i][j]==1) break;
for(i=p2-1;i>=p1;i--)
a[i][j]=tmp--;
i++,p2--;
for(j=q2-1;j>=q1;j--)
a[i][j]=tmp--;
j++,q2--;
}
}
else
{
j=n-1,p1=0,p2=n,q1=0,q2=n-1;
while(1)
{
for(i=p2-1;i>=p1;i--)
a[i][j]=tmp--;
i++,p2--;
for(j=q2-1;j>=q1;j--)
a[i][j]=tmp--;
j++,q2--;
for(i=p1+1;i<=p2;i++)
a[i][j]=tmp--;
i--,p1++;
for(j=q1+1;j<=q2;j++)
a[i][j]=tmp--;
j--,q1++;
if(a[i][j]==1) break;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%3d",a[i][j]);
putchar('\n');
}
return 0;
}