L国的战斗之伞兵

题目背景

L国即将与I国发动战争!!

题目描述

为了在敌国渗透作战,指挥官决定:派出伞兵前往敌国!然而敌国的风十分强烈,能让伞兵在同一高度不停转悠,直到被刮到一个无风区……(可怜的小兵)

输入输出格式

输入格式:

第一行:n、m两个正整数,表示敌国的大小。

以下n行,每行m个字符,“u”表示风向北吹;“d”表示风向南吹;“l”表示风向西吹;“r”表示风向东吹;“o”表示无风。(上北下南,左西右东)

输出格式:

一个数:表示有几个点可以放下伞兵。

输入输出样例

输入样例#1: 复制
5 5
rrrrr
rdddr
rroll
uuuuu
uuuuu
输出样例#1: 复制
19

说明

数据范围:

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;
}
原文地址:https://www.cnblogs.com/czy-power/p/10470022.html