总的来说就是按照从左到右,从上到下,从右到左,从下到上四个方向不断填充一个n*m的空矩阵,注意每一个方向填充完毕以后的边界内缩就行。
#include<stdio.h>
int main()
{
int n,m,i,j,r,c;
scanf("%d %d",&n,&m);//矩阵n行m列
int a[n+1][m+1],up=1,down=n,right=m,left=1,count=1;
while(count<=n*m)//总体思想——先建立一个n*m的空矩阵。触及边界时改变方向继续填充矩阵 ,直到填充完毕
{
for(i=left;count<=n*m&&i<=right;i++)//从左到右
a[up][i]=count++;
up++;//此时开始往下填充,坐标行数加一,向下内缩
for(i=up;count<=n*m&&i<=down;i++)//从上到下
a[i][right]=count++;
right--;//此时开始往左填充,坐标列数减一,向左内缩
for(i=right;count<=n*m&&i>=left;i--)//从右到左
a[down][i]=count++;
down--;//开始往上填充,坐标行数减一,向上内缩
for(i=down;count<=n*m&&i>=up;i--)//从下到上
a[i][left]=count++;
left++;//重新开始向右填充,列坐标加一,向右内缩
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
printf("%3d",a[i][j]);//以矩阵形式输出该矩阵
printf("\n");
}
/*scanf("%d %d",&r,&c);//输入想要找到的坐标并输出该点的值。
printf("%d",a[r][c]);*/
return 0;
}