A题,水题,但是需要特判"0 0"因为至少至少走了一格= =。
B题,水题,但是补题的时候n=1的情况没考虑(或者说写挫了)导致WA了一发。
C题,数据小,可以直接暴力,用3个数组分别储存每一行变成3种类型的字符需要移动的最少位置。然后三个for来暴力枚举分别由这3行提供3种字符,更新答案即可。代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <iostream> 5 #include <map> 6 using namespace std; 7 const int N = 55; 8 9 char s[N][N]; 10 int cnt[5]; 11 int get(char c) 12 { 13 if(c>='0' && c<='9') return 1; 14 if(c>='a' && c<='z') return 2; 15 return 3; 16 } 17 int a[N],b[N],c[N]; 18 19 int main() 20 { 21 int n,m; 22 cin >> n >> m; 23 for(int i=1;i<=n;i++) 24 { 25 scanf("%s",s[i]+1); 26 a[i] = b[i] = c[i] = 1000; 27 for(int j=1;j<=m;j++) 28 { 29 int now = get(s[i][j]); 30 if(now == 1) a[i] = min(a[i], min(j-1, m-(j-1))); 31 if(now == 2) b[i] = min(b[i], min(j-1, m-(j-1))); 32 if(now == 3) c[i] = min(c[i], min(j-1, m-(j-1))); 33 } 34 } 35 int ans = 1000; 36 for(int i=1;i<=n;i++) 37 { 38 for(int j=1;j<=n;j++) 39 { 40 for(int k=1;k<=n;k++) 41 { 42 if(i==j || i==k || j==k) continue; 43 ans = min(ans, a[i]+b[j]+c[k]); 44 } 45 } 46 } 47 cout << ans << endl; 48 return 0; 49 }
D题,水题。排序一下乱搞即可。
E题,很有意思的题目。要注意的是dirx和diry数组必须按照顺序排好。详见代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <iostream> 5 #include <vector> 6 using namespace std; 7 const int N = 100000 + 5; 8 typedef long long ll; 9 10 int dirx[] = {0,-1,0,1}; 11 int diry[] = {1,0,-1,0}; 12 ll x[50],y[50]; 13 vector<int> G[50]; 14 void dfs(int u,int fa,ll now,int dir) 15 { 16 for(int i=0;i<G[u].size();i++) 17 { 18 int v = G[u][i]; 19 if(v == fa) continue; 20 int k; 21 for(k=0;k<4;k++) 22 { 23 if((dir & (1<<k)) == 0) 24 { 25 dir |= (1<<k); 26 break; 27 } 28 } 29 x[v] = x[u] + dirx[k] * now; 30 y[v] = y[u] + diry[k] * now; 31 dfs(v,u,now>>2,1<<(k+2)%4); 32 } 33 } 34 35 int main() 36 { 37 int n; 38 scanf("%d",&n); 39 for(int i=1;i<n;i++) 40 { 41 int u,v; scanf("%d%d",&u,&v); 42 G[u].push_back(v); 43 G[v].push_back(u); 44 } 45 for(int i=1;i<=n;i++) if(G[i].size() > 4) return 0*puts("NO"); 46 puts("YES"); 47 dfs(1,-1,1LL<<58,0); 48 for(int i=1;i<=n;i++) printf("%I64d %I64d ",x[i],y[i]); 49 return 0; 50 }