【演算法】BFS+雜湊解決八數位問題

來源:互聯網
上載者:User

標籤:efi   複製   font   字母   front   ring   memset   include   har   

15拼圖已經有超過100年; 即使你不叫這個名字知道的話,你已經看到了。它被構造成具有15滑動磚,每一個從1到15上,並且所有封裝成4乘4幀與一個瓦塊丟失。讓我們把丟失的瓷磚“X”; 拼圖的目的是安排瓷磚以便它們排序為:


1 2 3 4
5 6 7 8
9 10 11 12
13 14 15×


這裡唯一合法經營是交流‘X‘與它共用一個邊緣的瓷磚之一。作為一個例子,舉動下列順序解決了一個稍微加擾難題:


1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8
9×10 12 9 10×12 9 10 11 12 9 10 11 12
13 14 11 15 13 14 11 15 13 14×15 13 14 15×
R-> D-> R->


上一行中的字母指示哪個的“x”瓦片的鄰居交換在每一步的“x”瓦片; 合法的值是‘R‘,‘L‘,‘U‘和‘D‘,右,左,上,下,分別。

並非所有的難題都可以解決; 在1870年,一個叫薩姆·勞埃德的人是著名的分配難題的一個無法解決的版本,
折騰了不少人。事實上,所有你必須做的,使一個普通的益智成無法解決的一個是交換兩個瓷磚(不包括課程的缺失‘X‘瓦)。

在這個問題中,你會寫三個解決不太知名的8益智,磚組成一個三的程式
安排。

 

思路分析:

從第一步開始,我們每一步都有不多於四種選擇:將白格向上移;向下移;向左移;向右移。這很像是做迷宮。走迷宮的任務是走到某一點就算贏。而八數位,是走到什麼局面才算贏。那麼隊列中存放的就不是點,而是面。換句話說,就是圖。現在問題變得很簡單,只要你能在一張3×3的圖上裸著BFS一遍,搜到靶心圖表就算你贏了。就像迷宮的vis數組一樣,我們需要對走過的局面設定標記,不要重複走。

 

在做這道題中學到的幾樣小技巧:

 

1. 數組直接用memcpy, memcmp對整塊記憶體進行複製或者比較, 速度比用for迴圈快。

 

2.用typedef來定義一個新名稱可以更加方便。

 

3.雜湊表與編碼的應用

 

    #include<stdio.h>    #include<string.h>     #define MAXN 500000        char input[30];      int state[9], goal[9] = {1,2,3,4,5,6,7,8,0};      int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; // 上,下,左, 右      char path_dir[5] = "udlr";      int st[MAXN][9];      int father[MAXN], path[MAXN]; // 儲存列印路徑            const int MAXHASHSIZE = 1000003;      int head[MAXHASHSIZE], next[MAXN];            void init_lookup_table() { memset(head, 0, sizeof(head)); }            typedef int State[9];      int hash(State& s) {        int v = 0;        for(int i = 0; i < 9; i++) v = v * 10 + s[i];        return v % MAXHASHSIZE;            }            int try_to_insert(int s) {        int h = hash(st[s]);        int u = head[h];        while(u) {          if(memcmp(st[u], st[s], sizeof(st[s])) == 0) return 0;          u = next[u];        }        next[s] = head[h];        head[h] = s;        return 1;      }            int bfs(){          init_lookup_table();          father[0] = path[0] = -1;          int front=0, rear=1;          memcpy(st[0], state, sizeof(state));                    while(front < rear){              int *s = st[front];                           if(memcmp(s, goal, sizeof(goal))==0){                  return front;              }                    int j;              for(j=0; j<9; ++j) if(!s[j])break; // 找出0的位置              int x=j/3, y=j%3;     // 轉換成行,列                            for(int i=0; i<4; ++i){                        int dx = x+dir[i][0]; // 新狀態的行,列                  int dy = y+dir[i][1];                  int pos = dx*3+dy;    // 目標的位置                        if(dx>=0 && dx<3 && dy>=0 && dy<3){                      int *newState = st[rear];                      memcpy(newState, s, sizeof(int)*9);                      newState[j] = s[pos];                      newState[pos] = 0;                      if(try_to_insert(rear)){                          father[rear] = front;  path[rear] = i;                          rear++;                      }                  }              }               front++;          }          return -1;      }            void print_path(int cur){          if(cur!=0){              print_path(father[cur]);              printf("%c", path_dir[path[cur]]);          }      }            int main(){                    while(gets(input)){              // 轉換成狀態數組, ‘x‘用0代替              for(int pos=0, i=0; i<strlen(input); ++i){                  if(input[i]>=‘0‘ && input[i]<=‘9‘)                      state[pos++] = input[i]-‘0‘;                  else if(input[i]==‘x‘)                      state[pos++] = 0;              }              int ans;              if((ans=bfs())!=-1){                   print_path(ans);                  printf("\n");              }          }              }  

 

【演算法】BFS+雜湊解決八數位問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.