题目
输入两个整数 n 和 m*,输出一个 n* 行 m 列的矩阵,将数字 11 到 n×m按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
输入共一行,包含两个整数 n 和 m。
输出格式
输出满足要求的矩阵。 矩阵占 n* 行,每行包含 m*个空格隔开的整数。
样例
输入数据
3 3
输出样例
1 2 3
8 9 4
7 6 5
解题思路
- 其实这道题没有多少算法的东西 就是纯模拟的题
- 就模拟一下题目给出的样子走一遍
- 这里有一个技巧 用两个数组 模拟 上下左右 走动
代码
首先给我自己写的代码 能得出答案 但是就是时间超了 可以借鉴一下而已
#include<iostream>
using namespace std;
const int N=110;
int a[N][N]={0};
int top,bm;
int rigth,ligth;
int main ()
{
int n,m,sum=1,tep=0;
cin>> n>> m;
top=1;
bm=n;
rigth=1;//左
ligth=m;//右
while(tep!=n*m)
{
int r=rigth;
while(r<=ligth)
a[top][r++]=sum++,tep++;
top++;
int t=top;
while(t<=bm)
a[t++][ligth]=sum++,tep++;
ligth--;
int l=ligth;
while(l>=rigth)
a[bm][l--]=sum++,tep++;
bm--;
int b=bm;
while(b>=top)
a[b--][rigth]=sum++,tep++;
rigth++;
}
for(int i=1;i<=n;i++)
{ for(int j=1;j<=m;j++)
cout<< a[i][j]<< " ";
cout<< endl;
}
return 0;
}
接下来给出正确的代码
#include<iostream>
using namespace std;
const int N=110;
int a[N][N];
int main()
{ int n,m;
cin>> n>> m;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};//储存走的方向
int i=1,j=1,d=0;
for(int p=1;p<=n*m;p++)
{
a[i][j]=p;
int x=i+dx[d];
int y=j+dy[d];
//走到边界就转向
if(x<1||x>=n+1||y<1||y>=m+1||a[x][y]>0)
{
d=(d+1)%4;
x=i+dx[d];
y=j+dy[d];
}
i=x;
j=y;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<< a[i][j]<< " ";
cout<< endl;
}
}