同学们要参加运动会开幕式团体操表演啦。各个系派出的队排出的队形可有四种形式。例如,图6-8~图6~11 是按16人排列的队形描述。
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
|
|
图6-8 连续队形,按行展开,每行6人
1
|
4
|
7
|
10
|
13
|
16
|
2
|
5
|
8
|
11
|
14
|
|
3
|
6
|
9
|
12
|
15
|
|
图6-9 连续队形,按列展开,每行3人
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
|
|
|
图6-10 梅花桩队形,按行展开,每行7人
1
|
|
6
|
|
11
|
|
16
|
|
4
|
|
9
|
|
14
|
|
2
|
|
7
|
|
12
|
|
|
|
5
|
|
10
|
|
15
|
|
3
|
|
8
|
|
13
|
|
|
图6-11 梅花桩队形,按列展开,每行5人
其中梅花桩队形的行数或列数没有偶数情形。
无论哪种队型,都请你能迅速指出某个编号的队员在队列中的行列号。因为领导和裁判们在台上需要及时了解每个队员的表现,将编号与具体队员对应便可以准确地奖优罚差。显然这是一个光荣而不怎么艰巨的任务,请你一定要把握啊!
输入说明:
文件中第一行只有一个整数k(<=100),表明随后有K组数据。每组数据占一行,由5个以空格隔开的整数N、X、Y、R、M构成,其中:
N(<=1000)表示队列的人数;
X为队形,1表示连续队形,2表示梅花桩队形,没有其他队形;
Y为展开队形,1表示按行展开,2表示按列展开,没有其他展开方式;
R(<=M)为每行或每列的人数;
M(<=N)为所要求其行列号的某个队员编号。
输出说明:
依次输入每一个队列中某个队员的行列号。行号和列号以空格隔开。
代码:
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;
void getPosition(const vector<int> &a){
clock_t start = clock();
//总人数,1表示连续队型2表示梅花桩阵型,1表示按行展开2表示按列展开,每行或每列人数,指定的队员编号
int N,X,Y,R,M;
int row,col; //行,列
N=a.at(0); X=a.at(1); Y=a.at(2); R=a.at(3); M=a.at(4);
//默认按行方式
row = N/R + (N%R==0?0:1);
if(X==2) row+= N/R + (N%R?0:1); //梅花桩
col = R;
if(Y==2){
int t = row; row=col; col=t; }
vector<vector<int>> list; // 存放队列的向量
list.resize(row);
for(int i=0;i<row;i++)
list[i].resize(col,0);
//行列倒置
int r1=row,c1=col;
if(Y==2){ r1=col;c1=row;}
for(int i=0,num=0,ct=0;i<r1;i++){
for(int j=0;j<c1;j++){
ct++;
if(X==2 && ct%2==0)
continue;
num++;
if(num<=N){
if(Y==1)
list[i][j]=num;
else
list[j][i]=num;
}
}
}
int flag=1;
for(int i=0,num=0,ct=0;i<row && flag;i++)
for(int j=0;j<col;j++){
if(list[i][j]==M){
cout<<" row:"<<i+1<<" col:"<<j+1<<endl;
flag=0;
break;
}
}
cout<<" time:"<<(clock()-start)/CLK_TCK<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<vector<int>> list;
ifstream in("team.txt");
int n,t; in>>n; in.ignore();
list.resize(n);
for(string s;n-- && getline(in,s);)
for(istringstream sin(s);sin>>t;list[list.size()-n-1].push_back(t));
for(int i=0;i<list.size();i++)
getPosition(list.at(i));
system("pause");
return 0;
}
team.txt:
2
16 1 1 6 11
15 2 2 5 11
运行结果:
row:2 col:5
time:0
row:1 col:5
time:0
请按任意键继续. . .