原題
很有意思的一道題, 因為是根據骰子的點數走迷宮, 自然就只能一步步模擬了.
最大的難題在於怎樣確定骰子旋轉後的情況. 由於骰子旋轉之後每個面點數的變化規律比較難找, 但由於骰子有六個面,而且每個面的對立面都是固定的, 因此只要知道其中兩個位置的點數就可以推斷出整個骰子的點數了。因此可以採用列舉法, 也就是可以用乙個二維陣列, 列舉存放固定兩個面(如front和top)之後剩下的第三個面(如right)的值。
有了這個方法,剩下的就是普通的dfs或bfs了,注意還是有可能no sollusion的, 因此還是要標記走過的情況, 也就是需要標記點的位置和走過時的骰子形狀.
ac**如下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#pragma warning(disable:4996) //關掉4996警告
/*uva 810
關鍵 : 模擬骰子-列舉情況(兩個面確定一種情況)
*/using
namespace
std;
const
int none = 0;
const
int star = -1;
typedef pair point;
int move[4][2] = ,,,, };
int maze[11][11];
map, bool> isvisited;
int rightface[7][7];
vector
result;
int rows, cols, x, y, top, front;
bool isfinished;
inline
int getopposite (int n)
void dfs (int row, int col, int f, int t)
printf ("(%d,%d)\n", x, y);
return;
}else
if ( !isvisited[make_pair(make_pair(row, col), make_pair(f, t))] )
dfs (nextrow, nextcol, nextf, nextt);}}
result.pop_back ( );
}return;
}int main( )
}cout
<< name << endl;
dfs (x, y, front, top);
if ( !isfinished ) cout
<< " no solution possible"
<< endl;
}system ("pause");
return
0;}
uva 10765 dfs及其應用
題意 乙個無向連通圖刪除某點後分成的連通塊個數成為該點的鴿子值。求鴿子值最大的m個點的鴿子值 思路 1.鴿子值 1 該點是割點。2統計割點所連線的點雙連通分量。tarjan演算法求割點過程中,改標記割點為統計該點所連線的點雙連通分量個數即可。include include include inclu...
uva10160 dfs 狀態壓縮
題意 給出n個點,以及m條邊,這些邊代表著這些點相連,修乙個電力站,若在某一點修乙個站,那麼與這個點相連的點都可以通電,問所有的點都通電的話至少要修多少個電力站.思路 最多給出的是35個點,那麼若是搜尋的話,就是2 35.考慮狀態壓縮剪枝,若某個點修電力站,那麼周圍的所有點都有電了.include ...
UVA 679車的擺放 DFS
這是一道簡單的深度優先搜尋問題 附上題目鏈結 這道題跟八皇后問題類似,思路大致為 把棋盤的每一格視作乙個狀態,符合要求就擺放,不符合就進入下一狀態,到達最後一格就開始回溯,直至走完每乙個狀態,由於是每一次都走到最後一格,符合深度優先搜尋的思路。附上ac include include include...