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作為估價函式進行排列,也就是優先選擇可能最優的節點進行擴充套件。對於八數碼問題,以下幾個問題需要知道 判斷有無解問題 根據逆序數直接判斷有無解,對於乙個八數碼,依次排列之後,每次是將空位...