牛客题解——牛牛家的房子

题目描述

城市有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;
    }
posted @ 2022-12-11 08:56  NightinGaleDekker  阅读(79)  评论(0)    收藏  举报