時間限制:
1000 ms | 記憶體限制:
65535 kb
難度: 4
描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門(n<=5),它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這個門所需的所有鑰匙(每個門都至少有一把鑰匙),例如:現在a門有三把鑰匙,acm就必須找全三把鑰匙才能開啟a門。現在請你編寫乙個程式來告訴acm,他能不能順利的得到寶藏。
輸入輸入可能會有多組測試資料(不超過10組)。
每組測試資料的第一行包含了兩個整數m,n(1
輸出每行輸出乙個yes表示acm能找到寶藏,輸出no表示acm找不到寶藏。
樣例輸入
4 4s.x.
a.x.
..xg
....
3 4
s.xa
.axb
b.ag
0 0
樣例輸出
yesno
自己寫時候時候很困惑,不知道該怎麼設定標記讓尋寶人在可行範圍內遍歷一遍以後可以再去開門。最後的想法是:「先遍歷標記一遍以後,再把標記清空,再從開始位置重新遍歷一遍。第二次遍歷是及時遇到鑰匙也不再增加鑰匙的個數,遇到門的時候判斷已經找個的鑰匙個數是否可以開啟該門。」**寫的太繁瑣了,就不再貼出來,這裡貼出來大神「可笑痴狂」的**。思想是:「每次遞迴都檢查已經找個的鑰匙數是否可以開啟對應的門,如果可以開啟相應的門,則該門可通,便從門的位置處也進行遍歷。」
#include #include using namespace std;
struct node
q[5];
char map[25][25];
int maxkeyofdoor[5]; //儲存開啟乙個門所有的鑰匙數
int findkeyofdoor[5]; //儲存現今已經找到的鑰匙數
bool flag;
void dfs(int i, int j);
void check();
void dfs(int i, int j)
map[i][j] = 'x'; // 標記為已走
dfs(i-1, j);
dfs(i+1, j);
dfs(i, j-1);
dfs(i, j+1);
check();
}}void check()}}
}int main()
else if(map[i][j] >= 'a' && map[i][j] <= 'e')
++maxkeyofdoor[map[i][j] - 'a'];}}
dfs(tx, ty);
if(flag)
cout << "yes" << endl;
else
cout << "no" << endl;
}return 0;
}
nyoj82迷宮尋寶(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這...
迷宮尋寶(一) nyoj 82
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這...
Nyoj 82 迷宮尋寶(一)
include include include include using namespace std const int maxn 25 struct point pos point pos targetpos,doorpos 5 寶藏的位置,每個門的位置 char graph maxn maxn...