看了一晚的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 ...