主要是之前看其他博主也发过这道题总是觉得写起来还有一点点麻烦然后我又是个懒人懒得想太多嘛就自己扯一个看起来简单一点点的放上来了。
而且更主要的原因可能是我不会C++。/诚恳
中间废话比较多,代码在最后面。
一、题目
题目描述:
创建一个m行n列的数组,将1—m*n的数字螺旋填入
方向为右下左上
输入说明:
输入正整数m和n,以空格分隔
输出说明:
输出填好的数组,数组元素之间用空格分隔,数组每行之间以换行分隔
输入示例:
4 5
输出示例:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
和期中那一题就是一个是任意规格的矩阵一个是n*n的方阵的区别啦,反正思路都是一样qwq。
二、算法思路
总体思路和XDOJ那个消除游戏差不多,就是定义两个矩阵,一个是实形矩阵,另一个用来条件判断的判断矩阵(后来我给同学讲这种做法的时候甚至给它起了个名字叫染色法哈哈哈哈哈,数学学上头了)
首先a矩阵我们先不要动它,因为在这种方法定义中a是用来存放最终结果的矩阵,在这个题目中可能难点就在对于数字什么时候拐弯,要直行走多长的这个问题的判断以及执行。所以我们另外去定义一个作为判断性质的矩阵,就是b矩阵,要求和a矩阵一模一样,对其初始化后我们将需要使用的区域给它赋判断值,就是相当与去一大片区域把需要的区域给他标亮
(所以我叫它染色法/探头)
在对a矩阵填充的过程中我们把已经填过的部分再给他赋一个...随便啥值都行,反正不要和上面的判断值一样就行了。因为填过的地方不能再给它填值了对吧,所以判断矩阵相应地方的判断值就要让他失效。
然后就是遇见判断值就进行操作,主要是用来拐弯的,另外还定义了一个flag值来指示应该是向上走还是向什么方向走。
/莫名觉得这个字花花绿绿的很好看/
三、代码
#include <stdio.h>
int main()
{
int m,n,i,j,num=0;
int flag=1;
int a[100][100],b[100][100];
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
b[i][j]=2;//矩阵用来给a矩阵判断什么时候停止
for(num=1,i=0,j=0;num<=m*n;num++)//对num循环输入
{
a[i][j]=num,b[i][j]=0;
if(flag==1) j++;//flag==1表示填数向右走
if(flag==2) i++;//向下走
if(flag==3) j--;//向左走
if(flag==4) i--;//向右走
if(flag==1&&b[i][j+1]!=2) flag=2;//右边碰壁向下转
if(flag==2&&b[i+1][j]!=2) flag=3;//下面同理
if(flag==3&&b[i][j-1]!=2) flag=4;
if(flag==4&&b[i-1][j]!=2) flag=1;
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
其实就是期末复习人了呜呜呜,希望期末C语言别挂/合十/我太菜了。
话说这玩意交了130分是啥情况)