您的位置:首页 > 编程语言 > PHP开发

HDU - 旋转矩阵

2011-11-10 11:55 183 查看
知识点:找规律+指针模拟
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

3

Sample 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

,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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  output input ini