c++编程回形取数问题
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/13 22:39:30
c++编程回形取数问题
问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列.接下来m行每行n个整数,表示这个矩阵.输出格式输出只有一行,共mn个数,为输入矩阵回形取数得到的结果.数之间用一个空格分隔,行末不要有多余的空格.样例输入3 31 2 34 5 67 8 9 样例输出1 4 7 8 9 6 3 2 5 样例输入3 21 23 45 6 样例输出1 3 5 6 4 2 我是初学者,请大神讲讲怎么用循环做,求思路和参考代码,
问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列.接下来m行每行n个整数,表示这个矩阵.输出格式输出只有一行,共mn个数,为输入矩阵回形取数得到的结果.数之间用一个空格分隔,行末不要有多余的空格.样例输入3 31 2 34 5 67 8 9 样例输出1 4 7 8 9 6 3 2 5 样例输入3 21 23 45 6 样例输出1 3 5 6 4 2 我是初学者,请大神讲讲怎么用循环做,求思路和参考代码,
#include <cstdio>
const int MAXM = 200 + 10;
int m, n;
int num[MAXM][MAXM] = {0};
int ans[MAXM*MAXM];
int tempo = 0;
void init()
{
scanf("%d %d",&m,&n);
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d",&num[i][j]);
}
}
}
void solve(int beginrow, int beginline, int row, int line)
{
int i, j;
if (row == 0 || line == 0) return;
if (row == 1)
{
for (i = 0; i < line; i++)
{
ans[tempo] = num[beginrow][beginline];
beginline++;
tempo++;
}
return;
}
if (line == 1)
{
for (i = 0; i < row; i++)
{
ans[tempo] = num[beginrow][beginline];
beginrow++;
tempo++;
}
return;
}
int v = beginrow, h = beginline;
ans[tempo] = num[beginrow][beginline];
tempo++;
for (i = 0; i < row-1; i++)
{
v++;
ans[tempo] = num[v][h];
tempo++;
}
for (i = 0; i < line-1; i++)
{
h++;
ans[tempo] = num[v][h];
tempo++;
}
for (i = 0; i < row-1; i++)
{
v--;
ans[tempo] = num[v][h];
tempo++;
}
for (i = 0; i < line-2; i++)
{
h--;
ans[tempo] = num[v][h];
tempo++;
}
solve(v+1,h,row-2,line-2);
}
void output()
{
int cnt = n*m;
if (cnt == 0) return;
printf("%d",ans[0]);
for (int i = 1; i < cnt; i++)
{
printf(" %d",ans[i]);
}
printf("\n");
}
int main()
{
init();
int begin1 = m, begin2 = n;
solve(0,0,begin1, begin2);
output();
return 0;
}
璇峰弬鑰?娆㈣繋浜ゆ祦鍝?
const int MAXM = 200 + 10;
int m, n;
int num[MAXM][MAXM] = {0};
int ans[MAXM*MAXM];
int tempo = 0;
void init()
{
scanf("%d %d",&m,&n);
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d",&num[i][j]);
}
}
}
void solve(int beginrow, int beginline, int row, int line)
{
int i, j;
if (row == 0 || line == 0) return;
if (row == 1)
{
for (i = 0; i < line; i++)
{
ans[tempo] = num[beginrow][beginline];
beginline++;
tempo++;
}
return;
}
if (line == 1)
{
for (i = 0; i < row; i++)
{
ans[tempo] = num[beginrow][beginline];
beginrow++;
tempo++;
}
return;
}
int v = beginrow, h = beginline;
ans[tempo] = num[beginrow][beginline];
tempo++;
for (i = 0; i < row-1; i++)
{
v++;
ans[tempo] = num[v][h];
tempo++;
}
for (i = 0; i < line-1; i++)
{
h++;
ans[tempo] = num[v][h];
tempo++;
}
for (i = 0; i < row-1; i++)
{
v--;
ans[tempo] = num[v][h];
tempo++;
}
for (i = 0; i < line-2; i++)
{
h--;
ans[tempo] = num[v][h];
tempo++;
}
solve(v+1,h,row-2,line-2);
}
void output()
{
int cnt = n*m;
if (cnt == 0) return;
printf("%d",ans[0]);
for (int i = 1; i < cnt; i++)
{
printf(" %d",ans[i]);
}
printf("\n");
}
int main()
{
init();
int begin1 = m, begin2 = n;
solve(0,0,begin1, begin2);
output();
return 0;
}
璇峰弬鑰?娆㈣繋浜ゆ祦鍝?