L国的战斗之伞兵
题目背景
L国即将与I国发动战争!!
题目描述
为了在敌国渗透作战,指挥官决定:派出伞兵前往敌国!然而敌国的风十分强烈,能让伞兵在同一高度不停转悠,直到被刮到一个无风区……(可怜的小兵)
输入输出格式
输入格式:
第一行:n、m两个正整数,表示敌国的大小。
以下n行,每行m个字符,“u”表示风向北吹;“d”表示风向南吹;“l”表示风向西吹;“r”表示风向东吹;“o”表示无风。(上北下南,左西右东)
输出格式:
一个数:表示有几个点可以放下伞兵。
输入输出样例
说明
数据范围:
1≤n≤1000,1≤m≤1000.
Solution:dfs推出能到达的点。
#include<bits/stdc++.h> #define REP(i, a, b) for(int i = (a); i <= (b); ++ i) #define REP(j, a, b) for(int j = (a); j <= (b); ++ j) #define PER(i, a, b) for(int i = (a); i >= (b); -- i) using namespace std; const int maxn=1e3+5; template <class T> inline void rd(T &ret){ char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9'){ ret = ret * 10 + (c - '0'), c = getchar(); } } int n,m,ans; bool ok[maxn][maxn]; char str[maxn][maxn]; void dfs(int x,int y){ ok[x][y]=true; if(str[x+1][y]=='u')dfs(x+1,y); if(str[x-1][y]=='d')dfs(x-1,y); if(str[x][y-1]=='r')dfs(x,y-1); if(str[x][y+1]=='l')dfs(x,y+1); return; } int main() { rd(n),rd(m); REP(i,1,n)scanf("%s",str[i]+1); REP(i,1,n){ REP(j,1,m){ if(str[i][j]=='o')dfs(i,j); } } REP(i,1,n){ REP(j,1,m){ if(ok[i][j])ans++; } } cout<<ans<<endl; return 0; }