2017网易内推编程题(网格问题)

二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根小易想知道最多可以放多少块蛋糕在网格盒子里。

输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)

输出描述:
输出一个最多可以放的蛋糕数

输入例子:
3 2

输出例子:
4

分析:铺两列两行,从行的角度来讲要空两行,从列的角度讲要空两列;当欧几里得距离等于2的情况就是只有(x1-x2)=2或-2&& (y1-y2)=0、(x1-x2)=0 && (y1-y2)=2或-2两种情况。那我们只要遍历一遍所有的格子即可,用二维数组G来标记,0表示可以放蛋糕,1表示不可以放。从G[0][0]开始,G[0][0]可以放蛋糕,G[0][2]和G[2][0]不可以放。一般情况下每遍历一个格子,都要排除距离此个格子为2的两个格子。

#include <iostream>
#inlcude <string.h>
using namespace std;
int G[1002][1002];
int w,h; //长,宽

//判断x,y是否在范围内  
bool isOk(intx, int y){  
    return (x<w && y<h);  
}  

int main(){  
    while(cin>>w>>h){   
        //给每个格子初始化为0  
        memset(G,0,sizeof(G));

        int count=0; 
        int i,j; 
        for(i=0;i<w;i++) 
            for(j=0;j<h;j++){  
                if(G[i][j] == 0){     //遍历到的G[i][j]==0的个数就是可以放蛋糕的个数
                    count++;     
                    if(isOk(i+2, j)){  
                        G[i+2][j] = 1;  
                    }   
                    if(isOk(i, j+2)){  
                        G[i][j+2] = 1;  
                    }  
                }  
            }   
        cout<<count<<endl;  
    }
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值