hacker cup 2015 资格赛

A:交换一个数的两位,问能得到最大和最小的数是多少。

水题:

 1 // File Name: a.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年01月10日 星期六 17时16分44秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 LL a[20];
28 int T;
29 LL SP(LL i , LL j, LL tmp)
30 {
31      int x =(tmp)/a[i] % 10 ; 
32      int y =(tmp)/a[j] % 10 ;
33      if(x == 0 && j == T)
34          return tmp;
35      return tmp - x * a[i] - y*a[j] + y *a[i] + x*a[j]; 
36 }
37 int count(LL tmp)
38 {
39   int num = 0 ; 
40    while(tmp)
41    {
42      num ++;
43      tmp/= 10;
44    }
45    return num ;
46 }
47 int main(){
48    int t ;
49    scanf("%d",&t);
50    a[1] = 1; 
51    for(int i = 2;i <= 13 ;i++)
52    {
53      a[i] = a[i-1]*10;
54    }
55    for(int ca = 1 ; ca <= t ;ca ++)
56    {
57       LL tmp;
58       scanf("%lld",&tmp);
59       LL mx = tmp;
60       LL mi = tmp;
61       T = count(tmp);
62       for(int i = 1;i <= T;i ++)
63           for(int j = i + 1;j <= T ;j ++)
64           {
65             LL now = SP(i,j,tmp);
66             if(now > mx)
67                 mx = now;
68             if(now < mi)
69                 mi = now;
70           }
71       printf("Case #%d: %lld %lld
",ca,mi,mx);
72    }
73 
74 return 0;
75 }
View Code

B:给你n件物品,每个物品都有三种属性值,问从中选取任意件,能不能使得最后得到确定值

解题思路:二进制枚举

解题代码:

 1 // File Name: b.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年01月10日 星期六 17时55分37秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 int Ga,Gb,Gc;
28 int a[30],b[30],c[30];
29 bool solve(int k)
30 {
31    int t= 0 ; 
32    int ta,tb,tc;
33    ta = tb = tc = 0 ; 
34    while(k)
35    {
36       if(k % 2)
37       {
38         ta += a[t];
39         tb += b[t];
40         tc += c[t];
41       }
42       k /= 2;
43       t ++ ; 
44    }
45   //<F5> printf("%d %d %d
",ta,tb,tc);
46    if(ta == Ga && tb == Gb&& tc == Gc)
47    {
48        return  1;
49    }
50    return 0 ; 
51 }
52 int main(){
53   int T;
54   scanf("%d",&T);
55   for(int ca = 1;ca <= T; ca ++)
56   {
57       scanf("%d %d %d",&Ga,&Gb,&Gc);
58       int n;
59       scanf("%d",&n);
60       for(int i= 0;i < n;i++)
61       {
62         scanf("%d %d %d",&a[i],&b[i],&c[i]);
63       }
64       int total = (1 << n)-1;
65       int ok = 0 ; 
66       for(int i =0 ;i <= total;i ++)
67       {
68          if(solve(i))
69          {
70            ok = 1; 
71            break;
72          }
73       }
74       if(ok)
75         printf("Case #%d: yes
",ca);
76       else printf("Case #%d: no
",ca);
77   }
78 return 0;
79 }
View Code

C:给你一个网格图,其中每个网格中有墙,旋转的激光炮台,激光炮每秒旋转一次,问你最后从起点到终点最少能够几步到达

解题思路:图只有4种情况,所以只需要把四种情况全部打表出来,没走一步状态就跟着变化就行

解题代码:

  1 // File Name: c.cpp
  2 // Author: darkdream
  3 // Created Time: 2015年01月10日 星期六 20时10分04秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 
 26 using namespace std;
 27 int mp[5][105][105];
 28 int bex , bey ; 
 29 int enx,  eny ;
 30 int n , m; 
 31 int vis[105][105][105];
 32 void fillmap(int k )
 33 {
 34     for(int i = 1;i <= n;i ++)
 35     {
 36        for(int j = 1;j <= m ;j ++)
 37        {
 38           if(mp[k][i][j]  == 2) 
 39           {
 40             int x = i + 1; 
 41             while(mp[k][x][j] == 1 || mp[k][x][j] == -1)
 42             {
 43                    mp[k][x][j] = -1;
 44                 x ++ ; 
 45             }
 46           } else if(mp[k][i][j] == 3)
 47           {
 48             int x = i - 1; 
 49             while(mp[k][x][j] == 1 || mp[k][x][j] == -1)
 50             {
 51                    mp[k][x][j] = -1;
 52                 x -- ; 
 53             }
 54           } else if(mp[k][i][j] == 4)
 55           {
 56             int x = j + 1; 
 57             while(mp[k][i][x] == 1 || mp[k][i][x] == -1)
 58             {
 59                    mp[k][i][x] = -1;
 60                 x ++; 
 61             }
 62           }else if(mp[k][i][j] == 5)
 63           {
 64              int x = j -1; 
 65              while(mp[k][i][x] == 1 || mp[k][i][x] == -1)
 66              {
 67                 mp[k][i][x] = -1;
 68                 x --;
 69              }
 70           }
 71        }
 72     }
 73 }
 74 void print(int k )
 75 {
 76    for(int i = 1;i <= n;i ++)
 77    {
 78        for(int j = 1;j <= m ;j ++)
 79        {
 80           printf("%d ",mp[k][i][j]);
 81        }
 82        printf("
");
 83    }
 84    printf("
");
 85 }
 86 void changeto(int k )
 87 {
 88     for(int i = 1;i <= n;i ++)
 89     {
 90        for(int j = 1;j <= m;j ++)
 91        {
 92            if(mp[k-1][i][j] == 0)    
 93                mp[k][i][j] == 0;
 94            else if(mp[k-1][i][j] == 1)
 95                mp[k][i][j] = 1;
 96            else if(mp[k-1][i][j] == 2)
 97                mp[k][i][j] = 5;
 98            else if(mp[k-1][i][j] == 3)
 99                mp[k][i][j] = 4;
100            else if(mp[k-1][i][j] == 4)
101                mp[k][i][j] = 2;
102            else if(mp[k-1][i][j] == 5)
103                mp[k][i][j] = 3;
104            else if(mp[k-1][i][j] == -1)
105                mp[k][i][j] = 1;
106        }
107     }
108     fillmap(k);
109     //print(k);
110 }
111 struct node{
112   int x,y,step,flag;
113   node(){
114   
115   }
116   node(int _x ,int _y ,int _step ,int _flag)
117   {
118      x = _x; 
119      y = _y;
120      step = _step;
121      flag = _flag; 
122   }
123 }qu[101000];
124 int xadd[] = {1,-1,0,0};
125 int yadd[] = {0,0,-1,1};
126 int bfs()
127 {
128     memset(vis,0,sizeof(vis));
129     qu[1] = node(bex,bey,0,0);
130     vis[0][bex][bey] = 1; 
131     int l = 1; 
132     int r = 1;
133     while(l <= r)
134     {
135       // printf("%d %d
",qu[l].x,qu[l].y);
136        if(qu[l].x == enx && qu[l].y == eny)
137        {
138              return  qu[l].step;
139        }
140        int k = (qu[l].flag + 1)%4; 
141        for(int i = 0;i <= 3; i ++)
142        {
143            int tx = qu[l].x + xadd[i];
144            int ty = qu[l].y + yadd[i];
145            if(mp[k][tx][ty] == 1 &&  vis[k][tx][ty] != 1)
146            {
147               vis[k][tx][ty] = 1;
148               r ++ ; 
149               qu[r] = node(tx,ty,qu[l].step + 1, k);
150            }
151        }
152        l ++ ; 
153     }    
154     return 0 ;
155 }
156 int main(){
157     freopen("in.txt","r",stdin);
158     freopen("out","w",stdout);
159     int T;
160     scanf("%d",&T);
161     for(int ca = 1; ca <= T; ca ++)
162     {
163        scanf("%d %d",&n,&m);
164        char str[1000];
165        memset(mp,0,sizeof(mp));
166        for(int i = 1;i <= n;i ++)
167        {
168           scanf("%s",&str[1]);
169           for(int j = 1;j <= m;j ++)
170           {
171               if(str[j] == 'S') 
172               {
173                   bex = i ; 
174                   bey = j ; 
175                   mp[0][i][j] = 1;
176               }else if(str[j] == 'G')
177               {
178                   mp[0][i][j] = 1;
179                   enx = i ; 
180                   eny = j;
181               }else if(str[j] == '#')
182               {
183                   mp[0][i][j] = 0 ; 
184               }else if(str[j] ==  '.')
185                   mp[0][i][j] = 1 ;
186               else if(str[j] == 'v')
187                   mp[0][i][j] = 2; 
188               else if(str[j] == '^')
189                   mp[0][i][j] =3;
190               else if(str[j] == '>')
191                   mp[0][i][j] =4 ; 
192               else if(str[j] == '<')
193                   mp[0][i][j] =5;
194           }
195        }
196           
197           fillmap(0);
198           changeto(1);
199           changeto(2);
200           changeto(3);
201           //for(int i = 0 ;i <= 3;i ++ )
202             //  print(i);
203           int ok = bfs();
204           printf("Case #%d: ",ca);
205           if(ok == 0 )
206               printf("impossible
");
207           else printf("%d
",ok);
208     }
209 return 0;
210 }
View Code

相关推荐