Careercup - Microsoft面试题 - 5120588943196160
2014-05-10 22:58
原题:
Three points are given A(x1, y1), B(x2, y2), C(x3, y3). Write a method returning an array of points (x, y) inside the triangle ABC.
题目:给定三个点,找出所有这三点组成的三角形内的整点。(不能组成三角形也无所谓,结果为空即可。)
解法:出题者没有说是整点,但如果不是整点,就有无穷多个了。求整点的个数可以用Pick定律的公式。要求出所有整点的话,我的方法是找出一个内部的整点,然后向四个方向进行DFS,直到找出所有点。搜索过程中,需要判断点是否在三角形内部。我的判断方法是计算面积。对于整数问题,计算公式不要引入浮点数,误差是不必要的。所以海伦公式不可行,用行列式计算面积更为方便、准确。
代码:
// http://www.careercup.com/question?id=5120588943196160
#include <iostream>
#include <unordered_set>
#include <vector>
using namespace std; struct Point {
int x;
int y;
Point(int _x = , int _y = ): x(_x), y(_y) {};
}; struct hashFunctor {
size_t operator () (const Point &p) {
return p.x * + p.y;
};
}; struct equalFunctor {
bool operator () (const Point &p1, const Point &p2) {
return p1.x == p2.x && p1.y == p2.y;
};
}; typedef unordered_set<Point, hashFunctor, equalFunctor> point_set; int twoArea(int x1, int y1, int x2, int y2, int x3, int y3)
{
return abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2));
} bool inside(int x[], int y[], int px, int py)
{
int sum = ; sum += twoArea(x[], y[], x[], y[], px, py);
sum += twoArea(x[], y[], x[], y[], px, py);
sum += twoArea(x[], y[], x[], y[], px, py);
return sum == twoArea(x[], y[], x[], y[], x[], y[]);
} void DFS(int x[], int y[], int px, int py, point_set &um, point_set &visited)
{
static const int dir[][] = {
{-, },
{+, },
{, -},
{, +}
};
int i;
int newx, newy; visited.insert(Point(px, py));
um.insert(Point(px, py)); for (i = ; i < ; ++i) {
newx = px + dir[i][];
newy = py + dir[i][];
if (visited.find(Point(newx, newy)) == visited.end() &&
inside(x, y, newx, newy)) {
DFS(x, y, newx, newy, um, visited);
}
}
} void insidePoints(int x[], int y[], vector<Point> &points)
{
point_set um;
point_set visited;
int mx, my; mx = (x[] + x[] + x[]) / ;
my = (y[] + y[] + y[]) / ;
DFS(x, y, mx, my, um, visited); point_set::const_iterator usit;
for (usit = um.begin(); usit != um.end(); ++usit) {
points.push_back(Point(usit->x, usit->y));
}
um.clear();
visited.clear();
} int main()
{
int x[];
int y[];
vector<Point> points;
int i;
int n; while (cin >> x[] >> y[]) {
cin >> x[] >> y[];
cin >> x[] >> y[];
insidePoints(x, y, points);
n = (int)points.size();
for (i = ; i < n; ++i) {
cout << points[i].x << ' ' << points[i].y << endl;
}
points.clear();
} return ;
}
Careercup - Microsoft面试题 - 5120588943196160的更多相关文章
- Careercup - Microsoft面试题 - 6314866323226624
2014-05-11 05:29 题目链接 原题: Design remote controller for me. 题目:设计一个遥控器. 解法:遥控什么?什么遥控?传统的红外线信号吗?我只能随便说 ...
- Careercup - Microsoft面试题 - 6366101810184192
2014-05-10 22:30 题目链接 原题: Design database locks to allow r/w concurrency and data consistency. 题目:设计 ...
- Careercup - Microsoft面试题 - 24308662
2014-05-12 07:31 题目链接 原题: I have heard this question many times in microsoft interviews. Given two a ...
- Careercup - Microsoft面试题 - 5700293077499904
2014-05-12 00:02 题目链接 原题: For a given map (ie Bing map) given longitude/latitude/ how would you desi ...
- Careercup - Microsoft面试题 - 5204967652589568
2014-05-11 23:57 题目链接 原题: identical balls. one ball measurements ........ dead easy. 题目:9个看起来一样的球,其中 ...
- Careercup - Microsoft面试题 - 5175246478901248
2014-05-11 23:52 题目链接 原题: design an alarm clock for a deaf person. 题目:为聋人设计闹钟? 解法:聋人听不见,那么闪光.震动都可行.睡 ...
- Careercup - Microsoft面试题 - 5718181884723200
2014-05-11 05:55 题目链接 原题: difference between thread and process. 题目:请描述进程和线程的区别. 解法:操作系统理论题.标准答案在恐龙书 ...
- Careercup - Microsoft面试题 - 5173689888800768
2014-05-11 05:21 题目链接 原题: Complexity of a function: int func_fibonacci ( int n) { ) { return n; } el ...
- Careercup - Microsoft面试题 - 6282862240202752
2014-05-11 03:56 题目链接 原题: Given an integer array. Perform circular right shift by n. Give the best s ...
随机推荐
- IIS6 + PHP 访问页面出现:需要进行身份验证的问题
问题描述:之前在IIS6上安装了PHP扩展,发布了一个PHP网站可以正常访问,为了测试网站并发量修改了一个PHP的配置文件以后,再访问就弹出 需要用户名和密码. 同一目录下的 aspx文件可以正常访问 ...
- PHP版实现友好的时间显示方式(例如:2小时前)
完整php类,通常我会配合smary使用,快捷使用 (plugins/function.rdate.php),更多php技术开发就去php教程网,http://php.662p.com <?PH ...
- 使用plupload绕过服务器,批量上传图片到又拍云
本文最初发布于我的个人博客:Jerry的乐园 综述 论坛或者贴吧经常会需要分享很多图片,上传图片比较差的做法是上传到中央服务器上,中央服务器再转发给静态图片服务器.而这篇文章讲介绍如何使用pluplo ...
- 如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入
大多数脚本利用发生在用户可以将可执行代码(或脚本)插入您的应用程序时. 默认情况下,ASP.NET 提供请求验证.只要窗体发送包含任何 HTML,该验证都会引发错误. 您可以使用下列方法防止脚本利用: ...
- POJ C++程序设计 编程题#3 编程作业—多态与虚函数
编程题 #3 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面的程序输出 ...
- c语言学习的第五天
#include<stdio.h> #include<stdbool.h> int main() { _Bool num=1; if (num==true); { printf ...
- Spark和Hadoop作业之间的区别
Spark目前被越来越多的企业使用,和Hadoop一样,Spark也是以作业的形式向集群提交任务,那么在内部实现Spark和Hadoop作业模型都一样吗?答案是不对的. 熟悉Hadoop的人应该都知道 ...
- Thinkphp 下面执行crond
thinkphp开启cli支持 1.tp正好支持cli命令模式,手册的路径为13.7.4 如果是用的其他框架不支持cli,那么只能直接写程序了,其实就是写面向过程的最基础的php代码. 2.在入口文 ...
- 老外写的在桌面添加快捷方式(DELPHI XE5 ANDROID)
UsesAndroidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android,Androidapi.JNI.JavaTypes, FMX.Platfo ...
- 使用c#检测文件正在被那个进程占用 判断文件是否被占用的两种方法
C# 判断文件是否被占用的三种方法 using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.d ...