题目链接:https://ac.nowcoder.com/acm/problem/21607
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int maxn=22;
int n,r;
struct House{
int te,num; //te为房子温度,num为房子里的人数
};
House houses[maxn][maxn];
bool can_reach(int& x,int& y,int& i,int& j)
{
return abs(x-i)+abs(y-j)<=r;
}
House* find(int x,int y)
{
int re_x=0,re_y=0,max_te=houses[x][y].te;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(houses[i][j].te>max_te&&can_reach(x,y,i,j)) //这所房子的温度大于现在这所房子的温度,并且可达
{
max_te=houses[i][j].te;
re_x=i;
re_y=j;
}
}
}
if(re_x!=0)
{
return &houses[re_x][re_y];
}
else
{
return NULL;
}
}
int main()
{
cin>>n>>r;
int wendu;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>wendu;
houses[i][j].te=wendu;
houses[i][j].num=1;
}
}
int ans1=0,ans2=0;
while(1)
{
int flag2=false; //记录这次查找是否有人住进了新房
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(houses[i][j].num>=1) //房子有人
{
House* h=find(i,j);
if(h!=NULL)
{
(*h).num+=houses[i][j].num;
houses[i][j].num=0;
flag2=true;
}
}
}
}
if(!flag2)
{
break;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(houses[i][j].num>=1)
{
ans1++;
}
if(houses[i][j].num>ans2)
{
ans2=houses[i][j].num;
}
}
}
printf("%d %d\n",ans1,ans2);
return 0;
}