题目描述
城市有n排n列的房子。牛牛在每个格点(x,y)[0≤ x,y ≤ n]建了一所房子,冬天来了,(x, y)的室内温度为t[x*n + y]度。从(x1, y1)处的房子移动到(x2, y2)处的房子需要|x1 - x2| + |y1 - y2|分钟。此外,外面很冷,一个人最多只能在外面呆上r分钟。最初每个房子里只住一个人。然后每个人重复下面的过程:他们在一次旅行中找到他们能到达的最温暖的房子,然后搬到那里。人们重复这个动作,直到在离开他们当前的房子的r分钟内没有更温暖的房子。算出两个值:
- a = 当每个人都停止移动时,容纳至少一个人的房屋数量
- b = 同一所房子的最大人数
输入描述:
第一行输入两个整数n,r (1 ≤ n ≤ 20, 1 ≤ r ≤ 40 )
接下来n行每行输入n个整数 表示每个房子的温度,范围在[1,1000]内
输出描述:
输出一行,包含两个整数用空格隔开
示例1
输入
3 1
9 1 6
5 3 2
7 4 8
输出
4 4
解题思路
使用爆搜,查找比当前房子温度高的房子,全家搬入,以此循环
部分C++代码:
bool can_move(int& x1,int& y1,int& x2,int& y2){
return abs(x1-x2)+abs(y1-y2)<=r;
}
room* search(int x,int y){
int rx=0,ry=0,t=house[x][y].t;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(house[i][j].t>t && can_move(x,y,i,j)){
t=house[i][j].t;
rx=i;ry=j;
}
}
}
if(rx!=0)
return &house[rx][ry];
else
return NULL;
}
while(1){
int move=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(house[i][j].r>=1){
room* w=search(i,j);
if(w!=NULL){
(*w).r+=house[i][j].r;
house[i][j].r=0;move=1;
}
}
}
}
if(!move)break;
}
标签:牛家,int,题解,move,房子,牛客,house,y1,y2
From: https://www.cnblogs.com/NightinGaleCode/p/16972824.html