看見很多dalao寫了什麼雙向bfs,蒟蒻表示不會寫啊。
怎麼辦辦?
先來分析一下題目,一眼看去就是乙個搜尋題,考慮dfs與bfs。
先放乙份dfs的**:
#includeusing namespace std;
bool a[5][5],b[5][5];
char c;
int dx[5]=;
int dy[5]=;
int ans=0x3f3f3f3f;
int ax[110],bx[110],ay[110],by[110];
int ansx1[110],ansx2[110],ansy1[110],ansy2[110];
int cnt=0,ans_cnt;
mapmp;
inline string get()
inline bool check()
inline void dfs(int x,int y,int tot)
}if(y==5)return;
if(x==5)x=1,y++;
/*string s=get();
cout<4||bb<1||bb>4||a[aa][bb]==a[x][y])continue;
cnt++;
ax[cnt]=x;ay[cnt]=y;
bx[cnt]=aa;by[cnt]=bb;
swap(a[aa][bb],a[x][y]);
dfs(x+1,y,tot+1);
cnt--;
swap(a[aa][bb],a[x][y]);
}}int main()
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
dfs(1,1,0);
cout《這裡列舉每乙個點,進行上下左右的交換。看上去很(fei)有(chang)道(che)理(dan)的樣子,但是很明顯,有時候交換完下面的點還可以去交換上面的點,所以有時候會搜不到答案,只能拿到60分
藍題能拿60分也很不錯了呢
怎麼辦辦?
那麼當然要用bfs啦,(蒟蒻不會記錄方案的好辦法,只能暴力儲存啦)
#includeusing namespace std;
bool a[5][5],b[5][5];
char c;
int dx[5]=;
int dy[5]=;//上下左右
int ans=0x3f3f3f3f;
int ansx1[100],ansx2[100],ansy1[100],ansy2[100];
mapmp;//剪枝專用
struct node
;inline void bfs()}}
}}int main()
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
bfs();
cout
return 0;
}
洛谷P1225 數樓梯
樓梯有n階,上樓可以一步上一階,也可以一步上二階。編乙個程式,計算共有多少種不同的走法。乙個數字,樓梯數。走的方式幾種。輸入 4輸出 5 60 n 50 100 n 5000 下面正式進入這道題的題解 我今天寫了兩篇題解 都很水 這道題的話似乎有很多種方法,只是我見過的就好幾種 這裡就像大家推薦兩種...
洛谷 P1259 黑白棋子的移動
題目鏈結 遞迴 分治 打表 這題.一上來讓我有點兒蒙啊.但其實就在於找規律,舉幾個例子自己動手寫一下就恍然大悟了。比如這樣 當然,題目條件是4 n 100 只需要先將中間緊挨的黑白棋子和空格交換,再將最後兩個黑色棋子與空格交換就好啦!之後就很歡快地去敲鍵盤了!結果全部wa掉。然後才知道我畫的每個例子...
洛谷 p1080國王遊戲 題解
include include include include include p1080 國王遊戲 輸入1 大臣數n 2 國王左手數 國王右手數 3 n 2 大臣左手數 大臣右手數 輸出 獲得金幣最多的大臣獲得金幣數量 using namespace std int king left 0,kin...