C. Connect Three(构造)
题目链接:http://codeforces.com/contest/1087/problem/C
题目大意:给你三个点的坐标,让你用尽可能少的方块,让这三个点连起来。
具体思路: 我们先对这三个点进行排序,我们先选定第二个点,记录一下所有的点中,y的最小和最大,对于第二个点,我们竖着建立一个长度为(y的最大值-y的最小值+1)的长度,这一条的x坐标是第二个点的x坐标,然后剩下的第一个点和第三个点直接连向这个条就可以了。
AC代码:
1 #include <iostream> 2 #include <string> 3 #include <deque> 4 #include <stack> 5 #include<cmath> 6 #include <algorithm> 7 #include<map> 8 using namespace std; 9 # define ll long long 10 # define inf 0x3f3f3f3f 11 vector<pair<int,int> >vis; 12 map<pair<int,int>,bool>ju; 13 struct node 14 { 15 int x; 16 int y; 17 } q[20]; 18 bool cmp(node t1,node t2) 19 { 20 if(t1.x==t2.x) 21 return t1.y<t2.y; 22 return t1.x<t2.x; 23 } 24 int main() 25 { 26 int x1,y1,x2,y2,x3,y3; 27 cin>>x1>>y1; 28 cin>>x2>>y2; 29 cin>>x3>>y3; 30 int miny=inf,maxy=0; 31 miny=min(miny,y1); 32 miny=min(miny,y2); 33 miny=min(miny,y3); 34 maxy=max(maxy,y1); 35 maxy=max(maxy,y2); 36 maxy=max(maxy,y3); 37 int num=3; 38 q[1].x=x1; 39 q[1].y=y1; 40 q[2].x=x2; 41 q[2].y=y2; 42 q[3].x=x3; 43 q[3].y=y3; 44 sort(q+1,q+4,cmp); 45 for(int i=miny; i<=maxy; i++) 46 { 47 if(ju[make_pair(q[2].x,i)]==0) 48 vis.push_back(make_pair(q[2].x,i)); 49 ju[make_pair(q[2].x,i)]=1; 50 // cout<<q[2].x<<" "<<i<<endl; 51 } 52 for(int i=q[1].x; i<=q[2].x; i++) 53 { 54 // cout<<i<<" "<<q[1].y<<endl; 55 if(ju[make_pair(i,q[1].y)]==0) 56 vis.push_back(make_pair(i,q[1].y)); 57 ju[make_pair(i,q[1].y)]=1; 58 } 59 for(int i=q[2].x; i<=q[3].x; i++) 60 { 61 if(ju[make_pair(i,q[3].y)]==0) 62 vis.push_back(make_pair(i,q[3].y)); 63 ju[make_pair(i,q[3].y)]=1; 64 // cout<<i<<" "<<q[3].y<<endl; 65 } 66 cout<<vis.size()<<endl; 67 for(auto i:vis) 68 { 69 cout<<i.first<<" "<<i.second<<endl; 70 } 71 // for(int i=0; i<=1000; i++) 72 // { 73 // for(int j=0; j<=1000; j++) 74 // { 75 // if(vis[make_pair(i,j)]==0) 76 // continue; 77 // cout<<i<<" "<<j<<endl; 78 // } 79 // } 80 return 0; 81 }