Codeforces Round #394 (Div. 2) C.Dasha and Password(暴力)

http://codeforces.com/contest/761/problem/C

题意:
给出n个串,每个串的初始光标都位于0(列)处,怎样移动光标能够在凑出密码(每个串的光标位置表示一个密码的字符,密码至少包含3种字符:数字,小写字母,特殊符号)的情况下使得移动的光标步数最小。

 

思路:

因为每个串只提供一个密码,所以我们先预处理计算出每个字符串3种字符的最少移动步数。

然后接下三重循环枚举,分别表示数字,小写字母,特殊符号由第i,j,k行提供。

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstdio>
 7 using namespace std;
 8 
 9 const int inf=100;
10 
11 int n,m;
12 char s[55][55];
13 int w[55][3];
14 
15 int main()
16 {
17     //freopen("D:\\input.txt", "r", stdin);
18     while(~scanf("%d%d",&n,&m))
19     {
20         for(int i=0;i<n;i++)
21             scanf("%s",&s[i]);
22         for(int i=0;i<n;i++)
23         {
24             w[i][0]=w[i][1]=w[i][2]=inf;
25             for(int j=0;j<m;j++)
26             {
27                 if(isdigit(s[i][j]))  w[i][0]=min(w[i][0],min(j,m-j));
28                 else if(islower(s[i][j]))  w[i][1]=min(w[i][1],min(j,m-j));
29                 else w[i][2]=min(w[i][2],min(j,m-j));
30             }
31         }
32 
33         int ans=3*inf;
34         for(int i=0;i<n;i++)
35         {
36             for(int j=0;j<n;j++)
37             {
38                 for(int k=0;k<n;k++)
39                 {
40                     if(i==j||j==k||i==k)  continue;
41                     ans=min(ans,w[i][0]+w[j][1]+w[k][2]);
42                 }
43             }
44         }
45         printf("%d\n",ans);
46     }
47     return 0;
48 }

 

转载于:https://www.cnblogs.com/zyb993963526/p/6880442.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值