题目背景
L即将与I发动xx!!
题目描述
为了在渗透作战,决定:派出伞兵!然而风十分强烈,能让伞兵在同一高度不停转悠,直到被刮到一个无风区……(可怜的小兵)
输入格式
第一行: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.
反向DFS,如果你是一个一个格子深搜,绝对超时间。
那么我们换种思路,从无风区深搜出去,如果那个格子能走我们就走一下。
所以说从无风区出去的话,我们走的方向与正常走的方向恰恰相反,及从无风区向北走就是正常反向向南走......。
#include <iostream>
#include <string>
using namespace std;
char maze[1000][1000];
bool vis[1000][1000];
int n,m;
int ans=0;
bool in(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y)
{
if(maze[x-1][y]=='d'&&in(x-1,y))
{
vis[x-1][y]=1;
dfs(x-1,y);
}
if(maze[x][y-1]=='r'&&in(x,y-1))
{
vis[x][y-1]=1;
dfs(x,y-1);
}
if(maze[x+1][y]=='u'&&in(x+1,y))
{
vis[x+1][y]=1;
dfs(x+1,y);
}
if(maze[x][y+1]=='l'&&in(x,y+1))
{
vis[x][y+1]=1;
dfs(x,y+1);
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>maze[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(maze[i][j]=='o')
{
dfs(i,j);
ans++;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(vis[i][j]==1)
{
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}