同學們要參加運動會開幕式團體操表演啦。各個系派出的隊排出的隊形可有四種形式。例如,圖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
請按任意鍵繼續. . .