目錄
- P3206 Dungeon Master
- P3207 Lake Counting
- P3208 The Castle
- P896 仙島求藥
- P429 【基礎】走迷宮
- P2465 迷宮問題
- P952 【入門】算24點
P3206 Dungeon Master
這題是一個三維迷宮,其中用‘.’表示空地,‘#’表示障礙物,‘S’表示起點,‘E’表示終點,求從起點到終點的最小移動次數,解法和二維的類似,只是在行動時除了東南西北移動外還多了上下。可以上下左右前後移動,每次都只能移到相鄰的空位,每次需要花費一分鐘,求從起點到終點最少要多久。
- 分析
最少步數,考慮bfs,三維使用偏移陣列
點選檢視程式碼
P3207 Lake Counting
有一塊N×M的土地,雨後積起了水,有水標記為‘W’,乾燥為‘.’。八連通的積水被認為是連線在一起的。
請求出院子裡共有多少水窪?
點選檢視程式碼
#include<iostream>
using namespace std;
const int N=110;
char s[N][N];
bool st[N][N];
int n,m,ans;
int d[][2]={-1,-1, -1,0, -1,1, 0,-1, 0,1, 1,-1, 1,0,1,1};
void dfs(int x,int y){
st[x][y] = 1;
for(int i=0; i<8; i++){
int a=x+d[i][0], b=y+d[i][1];
if(a<0||a>=n||b<0||b>=m) continue;
if(s[a][b]=='.' || st[a][b]) continue;
dfs(a, b);
}
}
int main(){
cin>>n>>m;
for(int i=0; i<n; i++) cin>>s[i];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(s[i][j]=='W' && !st[i][j]){ dfs(i,j); ans ++; }
cout<<ans;
return 0;
}
P3208 The Castle
點選檢視程式碼
P896 仙島求藥
少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由M×N個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現在李逍遙想盡快找到仙藥,顯然他應避開有怪物的方格,並經過最少的方格,而且那裡會有神秘人物等待著他。現在要求你來幫助他實現這個目標。
點選檢視程式碼
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
const int N=22;
int n,m,ans,d[][2]= {-1,0, 1,0, 0,-1, 0,1};
char s[N][N];
int st[N][N];
struct T {
int x,y;
};
int sx,sy;
int bfs(int x,int y) {
memset(st, 0x00, sizeof st); // 8bit
queue<T> q;
q.push({x,y}), st[x][y] = 1;
while(q.size()) {
auto u = q.front();
q.pop();
x=u.x, y=u.y;
if(s[x][y]=='*') return st[x][y]-1;
for(int i=0; i<4; i++) {
int a=x+d[i][0], b=y+d[i][1];
if(a<0||a>=n||b<0||b>=m) continue;
if(s[a][b]=='#' || st[a][b]) continue;
q.push({a,b}), st[a][b] = st[x][y]+1;
}
}
return -1;
}
int main() {
// freopen("da.in", "r", stdin);
while(cin>>n>>m, n) {
if(n+m==0) break;
for(int i=0; i<n; i++) cin>>s[i];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(s[i][j]=='@') {
sx=i, sy=j;
break;
}
int t = bfs(sx,sy);
cout<<t<<endl;
}
return 0;
}
P429 【基礎】走迷宮
點選檢視程式碼
P2465 迷宮問題
點選檢視程式碼
P952 【入門】算24點
點選檢視程式碼