25. 配料员
成绩: 10 / 折扣: 0.8
背景
你是一名室内装潢工程队的配料员。你的伙伴们在铺大理石地砖的时候,习惯于按照以下两种之字形的遍历顺序之一:
学了 C 语言以后,你决定编写一个程序。无论你的伙伴们想要以何种遍历顺序铺设任何图案的任何大小的地砖方阵,你的程序都能正确地生成一个线性遍历序列,指示你每次该递给他们什么图案的地砖。
输入
首行为需要遍历的地砖矩阵的个数。第二行为第一个矩阵的维数(其中的 x 是小写字母 x,前后各有一个空格)。如果是一个 N 维的矩阵,则接下来的 N 行每一行为矩阵该行各列的元素,整型,以空格分隔,每一个整数代表一种基本图案的地砖。随后的一行为该矩阵遍历的模式,只能为 TL-BR 或者 TR-BL 两者之一。若有多个矩阵,则从下一行起重复上述的输入模式。
输出
按顺序输出所需原料的编号。
#include<stdio.h>
#include<string.h>
int floor[100][100];
int m,n,x,y,count;
void left();
void right();
void change();
void main()
{ char s[6];
int i,j,k,num;
scanf("%d",&num);
for(i=0;i<num;i++)
{ scanf("%d x %d",&m,&n);
for(j=0;j<m;j++)
for(k=0;k<n;k++)
scanf("%d",&floor[j][k]);
getchar();
gets(s);
if(!strcmp(s,"TR-BL"))
change();
x=0;y=0;
count=0;
{ while(x<m-1||y<n-1)
{
right();
count++;
if(x>=m-1&&y>=n-1)
break;
left();
count++;
}
printf("%d\n",floor[m-1][n-1]);
}
}
return ;
}
void change()
{ int i,j,c;
for(i=0;i<m;i++)
for(j=0;j<n/2;j++)
{ c=floor[i][j];
floor[i][j]=floor[i][n-1-j];
floor[i][n-1-j]=c;
}
return ;
}
void right()
{ while(x+y==count)
{
printf("%d,",floor[x][y]);
if(x==0||y==n-1)
{ if(x!=0&&y==n-1)
{ x++;
break;
}
if(x==0&&y==n-1)
{ x++;
break;
}
if(x==0)
{ y++;
break;
}
if(y==n-1)
x++;
break;
}
x--;
y++;
}
return ;
}
void left()
{ while(x+y==count)
{
printf("%d,",floor[x][y]);
if(y==0||x==m-1)
{ if(x==m-1&&y!=0)
{ y++;
break;
}
if(x==m-1&&y==0)
{ y++;
break;
}
if(y==0)
{ x++;
break;
}
if(x==m-1)
y++;
break;
}
x++;
y--;
}
return ;
}