Uva 810 DFS 骰子模擬

2021-07-08 10:17:55 字數 1625 閱讀 2320

原題

很有意思的一道題, 因為是根據骰子的點數走迷宮, 自然就只能一步步模擬了.

最大的難題在於怎樣確定骰子旋轉後的情況. 由於骰子旋轉之後每個面點數的變化規律比較難找, 但由於骰子有六個面,而且每個面的對立面都是固定的, 因此只要知道其中兩個位置的點數就可以推斷出整個骰子的點數了。因此可以採用列舉法, 也就是可以用乙個二維陣列, 列舉存放固定兩個面(如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...