有一个n行m列的方格棋盘,每个方格有3种情况:空地、危险、目标,分别用数字1 、2和3 表示。如果有一个骑士从左上(1,1)格出发,可以到达他周边的8个空地或目标格子里(不能走到棋盘外面地方)。骑士不能靠近危险格子,即不能进入危险格子的周围8个格子,问骑士能到达多少目标格?
输入格式
第一行2个正整数n和m,范围[4,100]。
下面n行,每行m个数(1、2或3),表示方格的情况。
输出格式
一个整数,答案。
输入/输出例子1
输入:
4 5
1 1 1 1 3
3 1 1 3 1
1 2 3 1 1
3 2 3 2 3
输出:
2
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[105][105];
struct Tnode{
int x,y;
};
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};
queue<Tnode>qu;
int BFS(int x0,int y0)
{
Tnode t;
t.x=x0,t.y=y0;
qu.push(t);
a[x0][y0]=0;
int ans=0;
while(qu.size()>0)
{
t=qu.front();
qu.pop();
for(int i=0;i<8;i++)
{
int nx=t.x+dx[i];
int ny=t.y+dy[i];
if((a[nx][ny]==1 || a[nx][ny]==3))
{
if(a[nx][ny]==3)
ans++;
Tnode p;
p.x=nx;
p.y=ny;
qu.push(p);
a[nx][ny]=0;
}
}
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]==2)
{
for(int k=0;k<8;k++)
{
int nx=i+dx[k];
int ny=j+dy[k];
if((a[nx][ny]==1 || a[nx][ny]==3))
{
a[nx][ny]=0;
}
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==2)
{
for(int k=0;k<8;k++)
{
int nx=i+dx[k];
int ny=j+dy[k];
if((a[nx][ny]==1 || a[nx][ny]==3))
{
a[nx][ny]=0;
}
}
}
}
}
cout<<BFS(1,1);
return 0;
}