身上无钱你莫邪

moye's c++ blog

C++求解队形编号

同学们要参加运动会开幕式团体操表演啦。各个系派出的队排出的队形可有四种形式。例如,图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个以空格隔开的整数NXYRM构成,其中:

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/+ (N%R==0?0:1);
    
if(X==2) row+= N/+ (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

请按任意键继续. . .

posted on 2008-12-20 20:13 莫耶 阅读(493) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

导航

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

常用链接

留言簿(3)

随笔档案

友情链接

搜索

最新评论

阅读排行榜

评论排行榜