> 1157: 零起点学算法64——回型矩阵
Description
输出n*m的回型矩阵
Input
多组测试数据
每组输入2个整数 n和m(不大于20)
Output
输出n*m的回型矩阵,要求左上角元素是1,(每个元素占2个位置,靠右)
Sample Input
4 3
Sample Output
1 2 3
10 11 4
9 12 5
8 7 6
Source
零起点学算法
#include<stdio.h>
int main()
{
int n,m,j,i,bj,bi,ti,tj,t,count,dir;
while(scanf("%d%d",&n,&m)!=EOF)
{
j=0; i=0; t=1; count=0;
bj=0; tj=m-1;
bi=0; ti=n-1;
//b为bottom,t为top,到达top或者bottom时赋值方向发生变化
int a[20][20]= {1};
//将除第一个元素外的所有元素都初始化为零
while(a[i-1][j]==0||a[i+1][j]==0||a[i][j-1]==0||a[i][j+1]==0)
//如果周围所有数都不为零则到了最后一个元素,结束赋值
{
dir=count%4;
//设置计数器,分别用0,1,2,3来表示向右,下,左,上走
switch(dir)
{
case 0://向右赋值
{
while(j<tj)
{
t++;
j++;
a[i][j]=t;
}
tj--;
}
break;
case 1://向下复制
{
while(i<ti)
{
t++;
i++;
a[i][j]=t;
}
ti--;
}
break;
case 2://向左赋值
{
while(j>bj)
{
t++;
j--;
a[i][j]=t;
}
bj++;
}
break;
case 3://向上赋值
{
while(i>bi+1)
{
t++;
i--;
a[i][j]=t;
}
bi++;
}
break;
}
count++;//计数器计数,确定方向
}
for(i=0; i<n; i++)
{
for(j=0; j<m-1; j++)
{
printf("%2d ",a[i][j]);
}
printf("%2d\n",a[i][j]);
}//输出数据
}
return 0;
}