DivI lev2
#include <iostream><br />#include <list><br />#include <vector><br />#include <cstring><br />#include <queue><br />#include <iterator><br />#include <algorithm><br />#include <sstream><br />using namespace std;</p><p>#define NODE_NUM(26 * 26 * 26 * 26)</p><p>typedef struct node {<br />long distance;<br />} node;</p><p>class SmartWordToy {<br />private:<br />node * vertex;<br />short * visited;<br />vector<string> pattern;</p><p>public:</p><p>long str2id(string str) {<br />long sum = 0;<br />for (int i= 0; i < 4; i++) {<br />sum = sum * 26 + str[i] - 'a';<br />}<br />return sum;<br />}</p><p>string id2str(long id) {<br />string str(4, 'a');<br />for (int i = 3; i >= 0; i--) {<br />str[i] = ('a' + id % 26);<br />id /= 26;<br />}<br />return str;<br />}</p><p>public:<br />SmartWordToy() {<br />vertex = new node[NODE_NUM];<br />memset(vertex, -1, sizeof(node) * NODE_NUM);</p><p>visited = new short[NODE_NUM];<br />memset(visited, 0, sizeof(short) * NODE_NUM);</p><p>}<br />~SmartWordToy() {<br />delete [] vertex;<br />}</p><p>int minPresses(string start, string finish, vector<string> forbid) {<br />// construct pattern<br />for (int i = 0; i < forbid.size(); i++) {<br />istringstream iss(forbid[i]);<br />string sub;<br />while (iss >> sub) {<br />pattern.push_back(sub);<br />}<br />}</p><p>// find the shortest path<br />queue<long>q;<br />long start_id = str2id(start);<br />vertex[start_id].distance = 0;<br />visited[start_id] = 1;<br />q.push(start_id);<br />while (!q.empty()) {<br />long cur_id = q.front();<br />q.pop();<br />string cur_str= id2str(cur_id);<br />if (cur_str == finish)<br />return vertex[cur_id].distance;</p><p>for (int i = 0; i < 4; i++)<br />for (int j = -1; j <= 1; j += 2) {</p><p>string tmp_str = cur_str;<br />tmp_str[i] += j;<br />tmp_str[i] = (tmp_str[i] - 'a' + 26) % 26 + 'a';</p><p>long next_id = str2id(tmp_str);</p><p>if (visited[next_id] == 1)<br />continue;</p><p>short forbid_flg = 0;<br />for (int k = 0; k < forbid.size(); k++) {<br />int match = 0;<br />for (int l = 0; l < 4; l++) {<br />size_t found = pattern[k * 4 + l].find(tmp_str[l]);<br />if (found != string::npos)<br />match++;<br />else<br />break;<br />}<br />if (match == 4) {<br />forbid_flg = 1;<br />break;<br />}<br />}</p><p>if (forbid_flg == 0) {<br />vertex[next_id].distance = vertex[cur_id].distance + 1;<br />visited[next_id] = 1;<br />q.push(next_id);<br />}<br />}<br />}<br />return -1;<br />}<br />};</p><p>int main()<br />{<br />SmartWordToy swt;<br />//cout << swt.str2id("abcd") << endl;<br />//cout << swt.id2str(731) << endl;</p><p>string start("aaaa");<br />string finish("zzzz");</p><p>vector<string> forbid;<br />forbid.push_back("bz a a a");<br />forbid.push_back("a bz a a");<br />forbid.push_back("a a bz a");<br />forbid.push_back("a a a bz");</p><p>cout << swt.minPresses(start, finish, forbid) << endl;<br />return 0;<br />}<br />