杭電 1043 Eight (A 搜尋)

2021-06-18 00:02:00 字數 1648 閱讀 8464

看了一晚的a*,早上的時候終於可以看懂這些個**了。

很早之前收藏過乙個講a*的帖子,可惜一直沒怎麼看明白,目測鏈結也找不到了,bfs果斷的tel了,然後,,,就沒有然後了,看discuss不是雙bfs就是a*,算了,還是學一下吧,畢竟挺喜歡搞遊戲的,雖然目前為止沒弄出過什麼像樣的東西來。運氣還不錯,搜到了幾個非常好的部落格,講的很詳細。

其中的康托展開被用來做雜湊,一開始還不怎麼明白啥玩意叫康托,百科了一下,基本了解個大概。

**:

#include#include#include#includeusing 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];

//唐拓展開求雜湊

int inv_hash(s ts)

return ans;

}//求h值,h值求的其實就是當前狀態中的8個數的位置與目的位置的偏移值

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

int abs(int x)

int h(s ts)

return val;

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

bool bfs()

//重新計算g,h,f值

v.g+=1; v.h=h(v); v.f=v.g+v.h;

int ihv=inv_hash(v);

if(vis[ihv]) continue;

vis[ihv]=1;

//記錄父節點

pre[ihv]=ihu;

if(i==0) op[ihv]='d';

else if(i==1) op[ihv]='r';

else if(i==2) op[ihv]='u';

else if(i==3) op[ihv]='l';

if(ihv==0)

return true;

qu.push(v);

} }return false;

}inline bool inv_check()

} return !(cnt&1);

}char in[100];

char stk[100];

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)//開始很不明白為什麼輸出的時候是從0開始,雜湊值怎麼可能會是0呢

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

putchar(stk[i]);

puts("");

}}

杭電1195 搜尋

題意 有乙個密碼鎖,給定了當前狀態和正確的狀態。求到達目的狀態所需的最小步數。每一步只能這樣做 對某位數加1,對某位數減1,交換相鄰兩數的位置。之前做的都是在矩陣上進行bfs,這次突然轉成這樣了都不會做了。但其實思路還都是一樣的。原來的矩陣,搜尋時要往四個方向找,現在需要往11個方向搜尋,這就是 狀...

杭電ACM substrings(搜尋)

本題應學會如何將字串的子串全部羅列出來。要設定三重循壞 僅限資料小的情況 include includeint main for i 0 i min 1 i for j i j min 1 j printf s n s n s1,s2 在某些可能出錯的資料後新增乙個輸出語句,方便dig bug s1...

深度搜尋dfs 杭電

1.判斷放入goal能否符合 2.由於要找出最多滿足條件的goal的個數,因而採用dfs法,在放入goal的情況下進入下一層dfs,然後還原即回溯 這層的dfs沒有goal include include using namespace std const int maxnum 10000 int ...