C语言将原来的矩阵顺时针旋转

来源:互联网 发布:windows找不到chrome 编辑:程序博客网 时间:2024/05/16 11:53
#include<stdio.h>#include<malloc.h>int main(){int n,i,j,k,temp1,temp2,line,row;int **p=NULL;printf("请输入矩阵维数:");scanf("%d",&n);if((p=(int**)malloc(sizeof(int*)*(n+1)))==NULL){printf("分配内存失败!!!\n");return 1;}for(i=0;i<n;i++){if((p[i]=(int*)malloc(sizeof(int)*(n+1)))==NULL){printf("分配内存失败!!!\n");return 1;}}for(i=0,k=1;i<n;i++){for(j=0;j<n;j++){p[i][j]=k++;}}printf("初始矩阵\n");for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%-4d",p[i][j]);}printf("\n");}//把矩阵旋转的思路就是每次旋转最外面的一圈,直至旋转至最内层for(i=0,j=0,k=1;k<=n*n;i++,j++){temp1=p[i+1][j];//用temp1保存将要被赋值的那个位置的数值,防止这个位置的数值被赋值后,原数据丢失for(row=j;row<n-j;row++,k++)//最外面一层上面的行赋值{temp2=p[i][row];p[i][row]=temp1;temp1=temp2;}for(line=i+1;line<n-i;line++,k++)//最外面一层右面的列赋值{temp2=p[line][n-j-1];p[line][n-j-1]=temp1;temp1=temp2;}for(row=n-j-2;row>=j;row--,k++)//最外面的一层下面的行赋值{temp2=p[n-i-1][row];p[n-i-1][row]=temp1;temp1=temp2;}for(line=n-i-2;line>=i+1;line--,k++)//最外面的一层左面的列赋值{temp2=p[line][j];p[line][j]=temp1;temp1=temp2;}}if(n%2!=0)//假如是奇数阶矩阵,最中心的一个数要赋值p[(n-1)/2][(n-1)/2]=temp1;printf("旋转之后的矩阵\n");for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%-4d",p[i][j]);}printf("\n");}for(i=0;i<n;i++){free(p[i]);p[i]=NULL;}free(p);p=NULL;return 0;}


0 0