【刷题史】深度搜索入门-网易笔试题

题目描述

N国的足球赛正进行得如火如荼。32支来自全国各个地区的队伍被分成了8个不同的小组:A组,B组,C组…H组。每个小组有4支球队,每组的前两名进入了十六强淘汰赛,现在需要进行十六强淘汰赛的抽签。

十六强淘汰赛是单场淘汰机制,即当场的胜者进入下一轮。同时8场对阵需要同时满足以下规则:

1、同一地区的球队不对阵

2、各小组第一不对阵

3、各小组第二不对阵

4、同一小组的第一和第二不对阵

需要注意的是,A1 vs B2和B2 vs A1被认为是一样的对阵,并且8场对阵的顺序打乱只算一种抽签结果,即

(A1 vs B2, A2 vs B1, C1 vs D2, C2 vs D1,E1 vs F2, E2vs F1, G1 vs H2, G2 vs H1)

以及

(C1 vs D2, C2 vs D1,B2 vs A1, B1vs A2,E1 vs F2, E2 vs F1, G1 vs H2, G2 vs H1)只算为一种抽签结果,因为两个结果中,每场比赛的对阵双方都是一致的。

现在我们想知道在满足规则的前提下,总共有多少种可能的抽签结果。

注意:本题只允许C++、Java语言提交,其他语言提交得分无效

 

输入描述:

每个输入数据包含多个测试点。每个测试点后有一个空行。

第一行为测试点的个数T(T<=10)。

每个测试点包含16行,分别给出16支出线队伍的信息。每行包含2个字符串X,Y,分别表示该队伍是来自第几小组的第几名,以及该队伍所来自的地区。地区Y用2个大写字符表示。X由一个大写字符和一个数字组成,且一定是[“A1”,“A2”,“B1”,“B2”…“H1”,“H2”]中的一个。如“C2 GZ”表示C组第2名是来自地区GZ的队伍。

注意16支队伍的信息不一定按照A1,A2…H1,H2的顺序给出。

 

输出描述:

对于每个测试点,输出一行,表示一共可能的抽签结果。

输入例子:

2

A1 GZ

A2 HZ

B2 HZ

B1 GZ

C1 GZ

C2 HZ

D1 GZ

D2 HZ

H2 HZ

H1 GZ

E1 GZ

E2 HZ

F1 GZ

F2 HZ

G1 GZ

G2 HZ

 

A1 GZ

A2 GZ

B2 GZ

B1 GZ

C1 GZ

C2 GZ

D1 GZ

D2 GZ

H2 GZ

H1 GZ

E1 GZ

E2 GZ

F1 GZ

F2 GZ

G1 GZ

G2 GZ

输出例子:

14833

0

 我使用深度搜索加递归做的,应该还可以用排列组合做,用STL中的next_permutation(还没有试)

代码如下:

#include<stdio h=""> #include<stdlib h=""> #include<string h=""> struct dw { char name[5]; char area[5]; }; int count; int l[16]; struct dw d[16]; int s[16]; void cqresult(int num,int pos) { int r; int t1,t2; int i,k; if(num==8) { count++; return; } else { if(l[pos]==1) { cqresult(num,pos+1); } //if(l[j]==0&&l[i]==0&&d[i].name[0]!=d[j].name[0]&&d[i].name[1]!=d[j].name[1]&&r!=0) else { //不用重复排序,一种顺序只记录一次 for(i=pos+1;i<16;i++) { if(l[i]==0) { r=strcmp(d[i].area,d[pos].area); if(d[i].name[0]!=d[pos].name[0]&&d[i].name[1]!=d[pos].name[1]&&r!=0) { l[i]=1; l[pos]=1; s[num]=pos; s[num+8]=i; cqresult(num+1,pos+1); l[i]=0; l[pos]=0; } } } } } } int main() { int n,i,j; char str[10],tmp[10]; scanf("%d",&n); getchar(); for(i=0;i<n;i++) { for(j=0;j<16;j++) { gets(str); d[j].name[0]=str[0]; d[j].name[1]=str[1]; d[j].area[0]=str[3]; d[j].area[1]=str[4]; d[j].name[2]=d[j].area[2]='\0'; l[j]=0; } count=0; cqresult(0,0); printf("%d\n",count); gets(tmp); } return 0; } </string></stdlib></stdio>




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值