描述
一个n*m的左螺旋阵是一个从右上角开始逆时针方向旋转,从n*m开始依次填写数字直到1为止的矩阵(类似于蚊香盘)。例如一个4*4的左螺旋矩阵是下面这个样子的:
13 14 15 16
12 3 4 5
11 2 1 6
10 9 8 7
再比如一个5行4列的左螺旋阵是下面这个样子的:
17 18 19 20
16 5 6 7
15 4 1 8
14 3 2 9
13 12 11 10
格式
输入格式
一行,输入两个正整数n和m(2≤n,m≤30),分别表示行和列数
输出格式
输出对应的左螺旋矩阵
样例
输入样例
6 4
输出样例
21 22 23 24
20 7 8 9
19 6 1 10
18 5 2 11
17 4 3 12
16 15 14 13
限制
时间限制:100 ms
内存限制:16384 KB
我的思路是:用while(1)外循环,设cnt_num初始值为n*m,cnt_x=0,cnt_y=m-1,数组ans[][]全为0,然后按顺序从四个方向(左、下、右、上)while内循环走,他们分别都有自己的跳出的条件,举个例子,跳出左的条件为ans[cnt_x][cnt_y] == 0 && cnt_y >= 0。这样一直到cnt_num==0跳出所有循环。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
md,因为提交前忘改一个值,这道题亏了70分。。。下面的代码已经更新,应该没问题了。
#include <iostream>
#include <string.h>
using namespace std;
int ans[35][35];
int main(){
int m, n;
scanf ("%d %d", &n, &m);
memset(ans, 0, sizeof(ans));
int cnt_x = 0;
int cnt_y = m-1;
int cnt_num = n*m;
while (1) {
while (ans[cnt_x][cnt_y] == 0 && cnt_y >= 0) { //左
ans[cnt_x][cnt_y] = cnt_num;
cnt_num--;
if(cnt_num == 0) {
break;
}
cnt_y--;
}
cnt_y++;
cnt_x++;
while (ans[cnt_x][cnt_y] == 0 && cnt_x < n) { //下
ans[cnt_x][cnt_y] = cnt_num;
cnt_num--;
if(cnt_num == 0) {
break;
}
cnt_x++;
}
cnt_x--;
cnt_y++;
while (ans[cnt_x][cnt_y] == 0 && cnt_y < m) { //右
ans[cnt_x][cnt_y] = cnt_num;
cnt_num--;
if(cnt_num == 0) {
break;
}
cnt_y++;
}
cnt_y--;
cnt_x--;
while (ans[cnt_x][cnt_y] == 0 && cnt_x >= 0) { //上
ans[cnt_x][cnt_y] = cnt_num;
cnt_num--;
if(cnt_num == 0) {
break;
}
cnt_x--;
}
cnt_x++;
cnt_y--;
if(cnt_num == 0) {
break;
}
}
for (int i=0; i<n; i++) {
printf ("%4d", ans[i][0]);
for (int j=1; j<m; j++) {
printf ("%4d", ans[i][j]);
}
printf ("\n");
}
return 0;
}