【刷題史】深度搜索入門-網易筆試題

題目描述

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>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章