zoukankan      html  css  js  c++  java
  • 牛客 字符串的转换路径问题

    题目链接:https://www.nowcoder.com/practice/9939decf61a748d1877774095ecd5ed2?tpId=101&tqId=33191&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

    题目大意:

      略。

    分析:

      先建图,然后 bfs 算每个节点到终点的最短距离,最后用 dfs 输出。

    代码如下:

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3  
      4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
      5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i)
      6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i)
      7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i)
      8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
      9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
     10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
     11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
     12  
     13 #define pr(x) cout << #x << " = " << x << "  "
     14 #define prln(x) cout << #x << " = " << x << endl
     15  
     16 #define LOWBIT(x) ((x)&(-x))
     17  
     18 #define ALL(x) x.begin(),x.end()
     19 #define INS(x) inserter(x,x.begin())
     20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
     21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c 
     22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
     23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
     24  
     25 #define ms0(a) memset(a,0,sizeof(a))
     26 #define msI(a) memset(a,0x3f,sizeof(a))
     27 #define msM(a) memset(a,-1,sizeof(a))
     28 
     29 #define MP make_pair
     30 #define PB push_back
     31 #define ft first
     32 #define sd second
     33  
     34 template<typename T1, typename T2>
     35 istream &operator>>(istream &in, pair<T1, T2> &p) {
     36     in >> p.first >> p.second;
     37     return in;
     38 }
     39  
     40 template<typename T>
     41 istream &operator>>(istream &in, vector<T> &v) {
     42     for (auto &x: v)
     43         in >> x;
     44     return in;
     45 }
     46 
     47 template<typename T>
     48 ostream &operator<<(ostream &out, vector<T> &v) {
     49     Rep(i, v.size()) out << v[i] << " 
    "[i == v.size() - 1];
     50     return out;
     51 }
     52  
     53 template<typename T1, typename T2>
     54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
     55     out << "[" << p.first << ", " << p.second << "]" << "
    ";
     56     return out;
     57 }
     58 
     59 inline int gc(){
     60     static const int BUF = 1e7;
     61     static char buf[BUF], *bg = buf + BUF, *ed = bg;
     62     
     63     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
     64     return *bg++;
     65 } 
     66 
     67 inline int ri(){
     68     int x = 0, f = 1, c = gc();
     69     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
     70     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
     71     return x*f;
     72 }
     73 
     74 template<class T>
     75 inline string toString(T x) {
     76     ostringstream sout;
     77     sout << x;
     78     return sout.str();
     79 }
     80 
     81 inline int toInt(string s) {
     82     int v;
     83     istringstream sin(s);
     84     sin >> v;
     85     return v;
     86 }
     87 
     88 //min <= aim <= max
     89 template<typename T>
     90 inline bool BETWEEN(const T aim, const T min, const T max) {
     91     return min <= aim && aim <= max;
     92 }
     93 
     94 typedef unsigned int uI;
     95 typedef long long LL;
     96 typedef unsigned long long uLL;
     97 typedef vector< int > VI;
     98 typedef vector< bool > VB;
     99 typedef vector< char > VC;
    100 typedef vector< double > VD;
    101 typedef vector< string > VS;
    102 typedef vector< LL > VL;
    103 typedef vector< VI > VVI;
    104 typedef vector< VB > VVB;
    105 typedef vector< VS > VVS;
    106 typedef vector< VL > VVL;
    107 typedef vector< VVI > VVVI;
    108 typedef vector< VVL > VVVL;
    109 typedef pair< int, int > PII;
    110 typedef pair< LL, LL > PLL;
    111 typedef pair< int, string > PIS;
    112 typedef pair< string, int > PSI;
    113 typedef pair< string, string > PSS;
    114 typedef pair< double, double > PDD;
    115 typedef vector< PII > VPII;
    116 typedef vector< PLL > VPLL;
    117 typedef vector< VPII > VVPII;
    118 typedef vector< VPLL > VVPLL;
    119 typedef vector< VS > VVS;
    120 typedef map< int, int > MII;
    121 typedef unordered_map< int, int > uMII;
    122 typedef map< LL, LL > MLL;
    123 typedef map< string, int > MSI;
    124 typedef map< int, string > MIS;
    125 typedef multiset< int > mSI;
    126 typedef multiset< char > mSC;
    127 typedef set< int > SI;
    128 typedef stack< int > SKI;
    129 typedef deque< int > DQI;
    130 typedef queue< int > QI;
    131 typedef priority_queue< int > PQIMax;
    132 typedef priority_queue< int, VI, greater< int > > PQIMin;
    133 const double EPS = 1e-8;
    134 const LL inf = 0x7fffffff;
    135 const LL infLL = 0x7fffffffffffffffLL;
    136 const LL mod = 1e9 + 7;
    137 const int maxN = 5e3 + 7;
    138 const LL ONE = 1;
    139 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
    140 const LL oddBits = 0x5555555555555555;
    141 
    142 struct Edge {
    143     int from;
    144     int to;
    145     
    146     Edge(int f, int t) : from(f), to(t){}
    147 };
    148 
    149 struct Vertex {
    150     int level;
    151     VI nexts;
    152     
    153     Vertex() {
    154         level = -1;
    155         nexts.clear();
    156     }
    157     
    158     void clear() {
    159         level = -1;
    160         nexts.clear();
    161     }
    162 };
    163 
    164 int N;
    165 string S, T; 
    166 int idxS, idxT;
    167 string arr[maxN];
    168 VVI ans;
    169 VI res;
    170 
    171 Vertex V[maxN];
    172 vector< Edge > E;
    173 bool vis[maxN];
    174 
    175 void addEdge(Edge &x) {
    176     V[x.from].nexts.PB(E.size());
    177     E.PB(x);
    178 }
    179 
    180 void init() {
    181     ans.clear();
    182     res.clear();
    183     For(i, 1, N + 1) V[i].clear();
    184     E.clear();
    185 }
    186 
    187 int calc(string &x, string &y) {
    188     assert(x.size() == 3 && y.size() == 3);
    189     
    190     int cnt = 0;
    191     Rep(i, x.size()) if(x[i] != y[i]) ++cnt;
    192     return cnt;
    193 }
    194 
    195 bool cmp(const int &x, const int &y) {
    196     return arr[E[x].to] < arr[E[y].to];
    197 }
    198 
    199 void build() {
    200     For(i, 1, N) {
    201         For(j, i + 1, N) {
    202             int ret = calc(arr[i], arr[j]);
    203             
    204             if(ret == 1) {
    205                 Edge t(i, j);
    206                 addEdge(t);
    207                 swap(t.from, t.to);
    208                 addEdge(t);
    209             }
    210         }
    211     }
    212     
    213     For(i, 1, N) sort(ALL(V[i].nexts), cmp); // 为了按照字典序输出 
    214 }
    215 
    216 void bfs(int s) {
    217     ms0(vis);
    218     QI Q;
    219     Q.push(s);
    220     vis[s] = 1;
    221     
    222     int cnt = 1;
    223     int len = 1;
    224     
    225     while(!Q.empty()) {
    226         int tmp = Q.front(); Q.pop();
    227         --cnt;
    228         
    229         V[tmp].level = len;
    230         if(tmp == idxS) return;
    231         
    232         Rep(i, V[tmp].nexts.size()) {
    233             Edge &e = E[V[tmp].nexts[i]];
    234             
    235             if(vis[e.to]) continue;
    236             vis[e.to] = 1;
    237             Q.push(e.to);
    238         }
    239         
    240         if(cnt == 0) {
    241             cnt = Q.size();
    242             ++len;
    243         }
    244     }
    245 }
    246 
    247 void dfs(int s) {
    248     if(s == idxT) {
    249         ans.PB(res);
    250         return;
    251     }
    252     
    253     Rep(i, V[s].nexts.size()) {
    254         Edge &e = E[V[s].nexts[i]];
    255         
    256         if(V[e.to].level != V[s].level - 1) continue;
    257         res.PB(e.to);
    258         dfs(e.to);
    259         res.pop_back();
    260     }
    261 }
    262 
    263 void printAns() {
    264     if(ans.empty()) cout << "NO
    ";
    265     else {
    266         cout << "YES
    ";
    267         Rep(i, ans.size()) {
    268             Rep(j, ans[i].size()) {
    269                 if(j) cout << " -> ";
    270                 cout << arr[ans[i][j]];
    271             }
    272             cout << endl;
    273         }
    274     }
    275 }
    276 
    277 int main() {
    278     //freopen("MyOutput.txt","w",stdout);
    279     //freopen("input.txt","r",stdin);
    280     //INIT();
    281     while(cin >> N >> S >> T) {
    282         init();
    283         
    284         For(i, 1, N) { // 输入无重复 
    285             cin >> arr[i];
    286             if(T == arr[i]) idxT = i;
    287         }
    288         
    289         arr[++N] = S;
    290         idxS = N;
    291         build(); // 建图
    292         
    293         bfs(idxT); // bfs构建最短路路标 
    294         res.PB(idxS);
    295         dfs(idxS); // dfs按照路标输出最短路 
    296         
    297         printAns();
    298     }
    299     return 0;
    300 }
    View Code
  • 相关阅读:
    【Azure 应用服务】在Azure App Service多实例的情况下,如何在应用中通过代码获取到实例名(Instance ID)呢?
    【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
    【Azure Developer】使用Azure Key Vault 的Key签名后,离线验证的一些参考资料
    【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
    【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(Xms512m Xmx1204m)?
    【Azure API 管理】APIM添加Logtoeventhub的策略后,一些相关APIM与Event Hub的问题
    【Azure API 管理】为调用APIM的请求启用Trace 调试APIM Policy的利器
    【Azure 事件中心】China Azure上是否有Kafka服务简答
    【Azure 应用服务】探索在Azure上设置禁止任何人访问App Service的默认域名(Default URL)
    【Azure 微服务】记一次错误的更新Service Fabric 证书而引发的集群崩溃而只能重建
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11417025.html
Copyright © 2011-2022 走看看