(水)POJ 3083 按規定方向遍歷方法

2021-07-11 01:47:24 字數 1352 閱讀 2207

題目大意:給乙個圖,需求3個解,第乙個和第二個分別為按照一定原則走到e的步數,規則為規定人有乙個面向,第乙個答案為依次按左前右後遍歷所需步數,第二個為依次按右前左後遍歷所需步數,其中前後左右都是以當前面向為參考係。第三個解為最短路。下面給出求第乙個解時的走法的例項:

我用0,1,2,3分別來代表西,北,東,南。假設我們從3的位置走到了當前位置,那麼面向肯定是朝向1即朝向北方的,此時我們的左,前,右,後分別指的是0,1,2,3方向。

分析:我們在dfs時可以用乙個引數q記下當前的面向,然後按照相對於當前面向q的4個方向左前右上遍歷便行了。具體方法請看**,有注釋。

附上**:

#include#include#include#include#include#define inf 0x3f3f3f3f3f

#define judge(x,y) a[x][y]=='.'&&!vis[x][y]

struct point };

using namespace std;

char a[45][45];

int d[45][45];

bool vis[45][45];

int _move[4][2] = , , , };

int n, m, ans1, ans2, ans3;

int sx, sy;

int ex, ey;

int dfs(int x,int y,int q,int kase) //q為當前面向,kase為第一種或者第二種走法的特定的值,當執行左優先走法時kase為3,右優先走法時為1,具體分析請往下看

} return res;

}int bfs() //bfs求最短路,dfs會超時

} }return 0;

}int main()

if (a[i][j] == 'e')

}int q;

if (sx == 1) q = 3; //確認處於s處的初始面向

else if (sx == n) q = 1;

else if (sy == 1) q = 2;

else q = 0;

ans1 = dfs(sx, sy, q, 3);

ans2 = dfs(sx, sy, q, 1);

ans3 = bfs() + 1; //+1的原因為結果一共經歷過哪些地方,包括起點,而不是走了多少步

printf("%d %d %d\n", ans1, ans2, ans3);

} return 0;

}

POJ 水題若干

poj 3176 cow bowling 這道題可以算是dp入門吧。可以用乙個二維陣列從下向上來搜尋從而得到最大值。優化之後可以直接用一維陣列來存。ps 用一維的時候要好好想想具體應該怎麼存,還是有技巧的 include include include includeusing namespace ...

POJ 水題若干

poj 1013 counterfeit dollar 題意 有一打硬幣,其中有乙個是假幣,質量可能較輕,也可能較重。通過三次稱重將假幣找出。由於計算機很難模仿人的想法來實現問題。這道題我糾結了很久。最後我是通過一一枚舉的笨方法做的。就是從a硬幣開始到l硬幣結束,一一假設其為假幣,其中又分為輕和重。...

POJ水題初級

初期 一.基本演算法 1 列舉.poj1753,poj2965 2 貪心 poj1328,poj2109,poj2586 3 遞迴和分治法.4 遞推.5 構造法.poj3295 6 模擬法.poj1068,poj2632,poj1573,poj2993,poj2996 二.圖演算法 1 圖的深度優先...