pku 2584 TShirt Gumbo

题目:http://poj.org/problem?id=2584

代码:

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 int n,m,mark[201],num[201],start[201],end[201];
4 bool map[201][201],visit[201];
5
6
7 void get_map()
8 {
9 int i,j,k;
10 char s[12];
11 scanf("%d",&n);
12 for(i=0;i<n;i++)
13 {
14 scanf("%s",s);
15 switch(s[0])
16 {
17 case 'S':start[i]=0;break;
18 case 'M':start[i]=1;break;
19 case 'L':start[i]=2;break;
20 case 'X':start[i]=3;break;
21 case 'T':start[i]=4;break;
22 }
23 switch(s[1])
24 {
25 case 'S':end[i]=0;break;
26 case 'M':end[i]=1;break;
27 case 'L':end[i]=2;break;
28 case 'X':end[i]=3;break;
29 case 'T':end[i]=4;break;
30 }
31 }
32 for(i=0;i<5;i++)
33 scanf("%d",&num[i]);
34 m=0;
35 memset(map,0,sizeof(map));
36 for(i=0;i<5;i++)
37 {
38 for(j=0;j<num[i];j++)
39 {
40 for(k=0;k<n;k++)
41 {
42 if(i>=start[k]&&i<=end[k])
43 map[m][k]=1;
44 }
45 m++;
46 }
47 }
48 }
49
50 bool dfs(int k)
51 {
52 int i;
53 for(i=0;i<n;i++)
54 {
55 if(map[k][i]&&!visit[i])
56 {
57 visit[i]=1;
58 if(mark[i]==-1||dfs(mark[i]))
59 {
60 mark[i]=k;
61 return true;
62 }
63 }
64 }
65 return false;
66 }
67
68 bool solve()
69 {
70 int i,count=0;
71 memset(mark,-1,sizeof(mark));
72 for(i=0;i<m;i++)
73 {
74 memset(visit,0,sizeof(visit));
75 if(dfs(i))
76 count++;
77 }
78 if(count==n)
79 return true;
80 return false;
81 }
82
83 int main()
84 {
85 char st[31];
86 while(scanf("%s",st)!=EOF)
87 {
88 if(!strcmp(st,"ENDOFINPUT"))
89 break;
90 get_map();
91 scanf("%s",st);
92 if(solve())
93 printf("T-shirts rock!\n");
94 else
95 printf("I'd rather not wear a shirt anyway...\n");
96 }
97 return 0;
98 }

  

原文地址:https://www.cnblogs.com/lujiacheng/p/2116658.html