排座系统c语言,2008noip排座位C语言详解.doc

2008noip排座位C语言详解

2008noip排座位C语言详解

2.排座椅

(seat.pas/c/cpp)D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列

的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生对数最少。

【输入】

输入文件seat.in的第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K

接下来D行,每行有4个用空格隔开的整数,第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

输入数据保证最优方案的唯一性。

【输出】

输出文件seat.out共两行。

第一行包含K个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。

第二行包含L个整数,b1b2……bk,表示第b1列和b1+1列之间、第b2列和第b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(行尾没有空格)。

【输入输出样例】

seat.inseat.out4 5 1 2 3

4 2 4 3

2 3 3 3

2 5 2 42

2 4【输入输出样例解释】

**※

※++1 2 3 4 5

上图中用符号*、※、+ 标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。

Int main()

{

FILE *fi,*fo;

Fi=fopen(“seat.in”,”r”);

Fo=fopen(“seat.out”,”w”);

Int m,n,k,l,d;

Int h[1000][2]={0},s[1000][2]={0};

Int I,j,t,x1,x2,y1,y2;

Fscanf(fi,“%d %d %d %d %d”,&m,&n,&k,&l,&d);

For(i=0;i

{

Fscanf(fi,”%d,%d,%d,%d,&x1,&y1,&x2,&y2);

If(x1=x2)

{

if(y1>y2)

S[y2][0]++;

Else s[y1][0]++;

}

If(y1=y2)

{

If(x1>x2)

H[x2][0]++;

Else h[x1][0]++;

}

For(i=0;i<1000;i++)

{

H[i][1]=I;

S[i][1]=I;

}

For(i=0;i<1000;i++)

For(j=i+1;j<1000;j++)

{

If(h[i][0]

{

T=h[i][0];

H[i][0]=h[j][0];

H[j][0]=t;

T=h[i][1];

H[i][1]=h[j][1];

H[j][1]=t;

}

If(s[i][0]

{

T=s[i][0];

s[i][0]=s[j][0];

s[j][0]=t;

s=s[i][1];

s[i][1]=s[j][1];

s[j][1]=t;

}}

For(i=0;i

For(j=i+1;j

If(h[i][1]>h[j][1])

{

T=h[i][1];

H[i][1]=h[j][1];

H[j][1]=t;

}

For(i=0;i

For(j=i+1;j

If(s[i][1]>s[j][1])

{

T=s[i][1];

s[i][1]=s[j][1];

s[j][1]=t;

}

For(i=0;i

Fprintf(fo,”%d ”,h[i][1]);

Fprintf(fo,”\n”);

For(i=0;i

Fprintf(fo,”%d ”,s[i][1]);

Fclose fi;

Fclose fo;

Return 0;

}

3

4

2

1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值