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 }
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 }
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 }