HDU 5094 Maze (BFS, State compression)

Source: Internet
Author: User

HDU 5094 Maze (BFS, State compression)
MazeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others)
Total Submission (s): 308 Accepted Submission (s): 112


Problem DescriptionThis story happened on the background of Star Trek.

Spock, the deputy captain of Starship Enterprise, fell into Klingon's trick and was held as prisoner on their mother planet Qo 'nos.

The captain of Enterprise, James T. Kirk, had to fly to Qo 'nos to rescue his deputy. Fortunately, he stole a map of the maze where Spock was put in exactly.

The maze is a rectangle, which has n rows vertically and m columns horizontally, in another words, that it is divided into n * m locations. an ordered pair (Row No ., column No .) represents a location in the maze. kirk moves from current location to next costs 1 second. and he is able to move to next location if and only if:

Next location is adjacent to current Kirk's location on up or down or left or right (4 directions ctions)
Open door is passable, but locked door is not.
Kirk cannot pass a wall

There are p types of doors which are locked by default. A key is only capable of opening the same type of doors. kirk has to get the key before opening corresponding doors, which wastes little time.

Initial location of Kirk was (1, 1) while Spock was on location of (n, m). Your task is to help Kirk find Spock as soon as possible.
InputThe input contains into test cases.

Each test case consists of several lines. three integers are in the first line, which represent n, m and p respectively (1 <= n, m <= 50, 0 <= p <= 10 ).
Only one integer k is listed in the second line, means the sum number of gates and Wils, (0 <= k <= 500 ).

There are 5 integers in the following k lines, represents xi1, yi1, xi2, yi2, gi; when gi> = 1, represents there is a gate of type gi between location (xi1, yi1) and (xi2, yi2); when gi = 0, represents there is a wall between location (xi1, yi1) and (xi2, yi2 ), (| xi1-xi2 | + | yi1-yi2 | = 1, 0 <= gi <= p)

Following line is an integer S, represent the total number of keys in maze. (0 <= S <= 50 ).

There are three integers in the following S lines, represents xi1, yi1 and qi respectively. that means the key type of qi locates on location (xi1, yi1), (1 <= qi <= p ).
OutputOutput the possible minimal second that Kirk cocould reach Spock.

If there is no possible plan, output-1.

Sample Input

4 4 991 2 1 3 21 2 2 2 02 1 2 2 02 1 3 1 02 3 3 3 02 4 3 4 13 2 3 3 03 3 4 3 04 3 4 4 022 1 24 2 1

Sample Output
14

Source2014 Shanghai national invitational competition-reproduction of the questions (thanks to Shanghai University for providing the questions)

Note that the key is always obtained, and the door only needs to be opened once. There may be more keys in the same location !!

#include 
 
  #include 
  
   #include 
   
    using namespace std;const int MAXN = 16, dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};int n, m, p, k, s, go[MAXN][MAXN][MAXN][MAXN], key[MAXN][MAXN], ans;bool visited[MAXN][MAXN][1<<10];struct State {    int x, y, key, step;    State(int _x, int _y, int _key, int _step) : x(_x), y(_y), key(_key), step(_step) {}};void init() {    memset(go, -1, sizeof(go));    memset(key, 0, sizeof(key));    memset(visited, false, sizeof(visited));    ans = -1;}void input() {    cin >> k;    for (int i = 0; i < k; i++) {        int x1, y1, x2, y2, g;        cin >> x1 >> y1 >> x2 >> y2 >> g;        go[x1][y1][x2][y2] = go[x2][y2][x1][y1] = g;    }    cin >> s;    for (int i = 0; i < s; i++) {        int x, y, q;        cin >> x >> y >> q;        key[x][y] |= 1 << (q-1);    }}void work() {    queue
    
      q;    q.push(State(1, 1, 0, 0));    while (!q.empty()) {        State cur = q.front();        q.pop();        if (cur.x == n && cur.y == m) {            ans = cur.step;            return;        }        cur.key |= key[cur.x][cur.y];        for (int i = 0; i < 4; i++) {            int nx = cur.x + dx[i], ny = cur.y + dy[i];            if (nx >= 1 && nx <= n && ny >= 1 && ny <= m) {                int gate = go[cur.x][cur.y][nx][ny];                if ((gate > 0 && (cur.key & (1 << (gate-1)))) || (gate == -1)) {                    if (!visited[nx][ny][cur.key]) {                        visited[nx][ny][cur.key] = true;                        q.push(State(nx, ny, cur.key, cur.step+1));                    }                }            }        }    }}void output() {    cout << ans << endl;}int main() {    ios::sync_with_stdio(false);    while (cin >> n >> m >> p) {        init();        input();        work();        output();    }    return 0;}
    
   
  
 


Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.