抓猫(d)

题目描述

流浪猫布满城市的每一个角落,非常影响市容市貌,作为城市聘请的抓猫者,你有一种捕捉器,一定可以捕捉到所有走到里面的猫,更加幸运的是你有一个非常厉害的动物心理学家,他可以预测猫在不同位置的行走方向(共有东、西、南、北四种情况)
为了节约经费,问你最少需要多少个捕捉器才能把所有的猫都抓住。

输入

输入第一行包含两个整数N和M(1<=N,M<=1000),表示城市被划分成N×M的网格。接下来N行,每行包含M个字符“E”、“W”、“S”、“N”代表东、西、南、北4个方向,表示当猫在该位置的行走方向,保证猫不会走出城市区域。

输出

输出一个整数表示最少需要的捕捉器数。

样例输入
3 4
SWWW
SEWN
EEEN
样例输出
2
数据范围限制

40% 1<=N,M<=4
100% 1<=N,M<=1000

AC代码:

#include<bits/stdc++.h>
using namespace std;
int k,n,m,s,head,tail,a[1005][1005];
char ch[1005][1005];
struct node
{int x,y;}q[1000005];
int main()
{
	freopen("d.in","r",stdin);
	freopen("d.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    for(int i=0;i<n;i++)
    {
    	scanf("%s",ch[i]);
    	getchar();
	}
    for(int i=0;i<n;i++)
    	for(int j=0;j<m;j++)
		{
	        if(a[i][j]==1)continue;
	        head=0,tail=1,q[tail].x=i,q[tail].y=j,s++,a[i][j]=1;
	        while(head<tail)
			{
	            head++;
	            int nx=q[head].x,ny=q[head].y;
	            if(ch[nx][ny]=='S'&&a[nx+1][ny]==0)
	                q[++tail].x=nx+1,q[tail].y=ny,a[nx+1][ny]=1;
	            if(ch[nx][ny]=='W'&&a[nx][ny-1]==0)
	                q[++tail].x=nx,q[tail].y=ny-1,a[nx][ny-1]=1;
	            if(ch[nx][ny]=='N'&&a[nx-1][ny]==0)
	                q[++tail].x=nx-1,q[tail].y=ny,a[nx-1][ny]=1;
	            if(ch[nx][ny]=='E'&&a[nx][ny+1]==0)
	                q[++tail].x=nx,q[tail].y=ny+1,a[nx][ny+1]=1;
	            if(a[nx-1][ny]==0&&ch[nx-1][ny]=='S')
	                q[++tail].x=nx-1,q[tail].y=ny,a[nx-1][ny]=1;
	            if(a[nx+1][ny]==0&&ch[nx+1][ny]=='N')
	                q[++tail].x=nx+1,q[tail].y=ny,a[nx+1][ny]=1;
	            if(a[nx][ny-1]==0&&ch[nx][ny-1]=='E')
	                q[++tail].x=nx,q[tail].y=ny-1,a[nx][ny-1]=1;
	            if(a[nx][ny+1]==0&&ch[nx][ny+1]=='W')
	                q[++tail].x=nx,q[tail].y=ny+1,a[nx][ny+1]=1;
	    	}
	    }
    printf("%d",s);
    return 0;
}
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值