每天从所占城堡中广搜看是否有周围的城堡能够被占领,如果能就加入,如果没人一个可以占领。输出NO
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define MAX 55
using namespace std;
int map[MAX][MAX],n,m,vis[MAX][MAX],x[MAX*MAX],y[MAX*MAX],k,power;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int search()
{
int m_c=0;
int now=k;
for(int i=0;i<now;i++)
{
int nx=x[i],ny=y[i];
for(int j=0;j<4;j++)
{
int u=nx+dx[j],v=ny+dy[j];
if(u<0||u>=n||v<0||v>=m||vis[u][v]||map[u][v]>=power) continue;
vis[u][v]=1;
x[k]=u;y[k++]=v;
m_c++;
}
}
return m_c;
}
int main()
{
//freopen("data.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
k=0;
int castle=1,day=0,flag=1;
cin>>n>>m;
//cout<<n<<" "<<m<<endl;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>map[i][j];
cin>>x[k++]>>y[k]; //从右到左
x[0]--;y[0]--;
//cout<<x[0]<<" "<<y[0]<<endl;
power=map[x[0]][y[0]];
vis[x[0]][y[0]]=1;
//cout<<power<<endl;
while(castle<n*m)
{
int t=search();
//cout<<t<<endl;
if(t==0) {flag=0;break;}
day++;
castle+=t;
power+=t;
}
if(flag) printf("YES %d\n",day);
else printf("NO %d\n",castle);
}
return 0;
}