搜尋高階 hdu 1043 Eight

2021-06-24 18:04:58 字數 2905 閱讀 3799

a*: 因為每次移動都會影響乙個點的曼哈頓距離(不算x),構造h()為所有數字塊的曼哈頓距離和,用逆序數hash(算x),根據逆序數奇偶性(不算x)減掉無法到達的情況;在構造優先佇列時當f相同時按照g值從大到小排序,這樣又是乙個很給力的減枝

#include #include #include using namespace std;

struct s

s(const s& ts)

friend bool operator < (const s& a,const s& b)

}s;const int fac = ;

bool vis[363000];

int pre[363000];

char op[363000];

inline int inv_hash(s ts)

ans += fac[i*3+j] * cnt;}}

return ans;

}const int pos[2]=,,,,,,,,};

inline int abs(int x)

inline int h(s ts)

return val;

}const int dir[4][2]=,,,};

bool bfs()

}

return false;

}inline bool inv_check()

}

}

return !(cnt&1);

}char in[111];

char stk[111];

int main()

y++; if(y == 3) y=0,x++;

}}

if(!inv_check())

s.g=0; s.h=h(s); s.f=s.h;

int shash = inv_hash(s);

if(shash==0)

bfs();

int top = -1 , thash = 0;

while(thash != shash)

for(int i=top;i>=0;i--)

puts("");

}return 0;

}

單廣預處理: 從最終狀態向所有狀態搜尋,記錄前驅,然後直接輸出就好

#include#include#includeusing namespace std;

struct s

s(const char *str)

ty++;

if(ty==3)}}

}};int pre[363000];

char op[363000];

const int fac=;

bool vis[363000];

inline int inv_hash(s ts)

ans+=fac[i*3+j]*cnt;}}

return ans;

} s s;

const int dir[4][2]=,,,};

const char cdir="dulr";

void bfs()

}} char in[100];

char stk[100];

int main()

if(ihs==0)

int top=-1,tmp=ihs;

while(tmp)

puts("");

}return 0;

}

ida*函式:和a*一樣的h()函式,記憶體占用小是其優勢。

#include#includeusing namespace std; 

struct s

s(const s& ts)

}x=ts.x; y=ts.y;

} void show()

puts("");}}

};const int pos[2]=,,,,,,,,};

inline int abs(int x)

inline int h(s ts)

}return val;

} int fac=;

inline int inv_hash(s ts)

ans+=fac[i*3+j]*cnt;}}

return ans;

} int dir[4][2]=,,,};

int ans[50],deep;

bool vis[363000];

s ts;

bool dfs(int d)

vis[tmp]=true;

ts.x=tx; ts.y=ty;

ans[d]=i;

if(dfs(d+1)) return true;

vis[tmp]=false;

ts.x=x; ts.y=y;

ts.maze[tx][ty]=ts.maze[x][y];

ts.maze[x][y]='x';

}return false;

} s s;

bool inv_check()}}

return!(cnt&1);

} char in[100];

int main()

y++;

if(y==3) y=0,x++;}}

if(!inv_check())

memset(vis,false,sizeof(vis));

vis[inv_hash(s)]=true;

ts=s; deep=0;

while(true)

for(int i=0;iputs("");

}return 0;

}

HDU 1043 搜尋 A 演算法

include include include include include include using namespace std const int maxn 4e5 10 const int mlen 30 char str mlen d udlr int ha 9 int dir 4 2 ...

HDU 1043 八數碼問題 A 搜尋

by cxlove 第乙個a 搜尋,a 是一種啟發式搜尋,g為已花代價,h為估計的剩餘代價,而a 是根據f g h作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...

HDU 1043 八數碼問題 A 搜尋

by cxlove 第乙個a 搜尋,a 是一種啟發式搜尋,g為已花代價,h為估計的剩餘代價,而a 是根據f g h作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...