ZOJ 1179 Finding Rectangles(DFS+剪枝)

来源:互联网 发布:淘宝大学生认证 编辑:程序博客网 时间:2024/06/01 09:41

首先开始对各个点的x坐标从小到大排序,然后每次搜索的时候只从下一个点开始

对于每个点必须和栈中的某个点x坐标或者y坐标相等,不然没有必要搜.

最后对结果排个序

#include <iostream>#include <cstdio>#include <memory.h>#include <algorithm>#include <vector>#include <string>#include <map>using namespace std;const int maxn=30;struct Point{char id;int x,y;bool operator<(const Point &rhs)const{return x<rhs.x||(x==rhs.x&&y<rhs.y);}}ps[maxn];int n,f,ccnt,cas;vector<Point>stak;map<int,int>xcnt,ycnt;vector<string>ans;bool isRec(){xcnt.clear();ycnt.clear();for (int i=0;i<stak.size();++i){xcnt[stak[i].x]++;ycnt[stak[i].y]++;}if(xcnt.size()!=2||ycnt.size()!=2)return false;else{map<int,int>::iterator it=xcnt.begin();for (;it!=xcnt.end();++it){if(it->second!=2)return false;}it=ycnt.begin();for (;it!=ycnt.end();++it){if(it->second!=2)return false;}}return true;}bool cmp(const Point &lhs,const Point&rhs){return lhs.y>rhs.y||(lhs.y==rhs.y&&lhs.x>rhs.x);}void dfs(int curi){if(stak.size()==4){if(isRec()){vector<Point>temp=stak;sort(temp.begin(),temp.end(),cmp);swap(temp[0],temp[1]);string str;str+=temp[0].id;str+=temp[1].id;str+=temp[2].id;str+=temp[3].id;ans.push_back(str);}return;};for (int i=curi;i<n;++i){if(stak.size()==0){stak.push_back(ps[i]);dfs(i+1);stak.pop_back();}else{for (int j=0;j<stak.size();++j){//必须和栈中某个点x或者y相等才继续if(stak[j].x==ps[i].x||stak[j].y==ps[i].y){stak.push_back(ps[i]);dfs(i+1);stak.pop_back();break;}}}}}int main(){cas=1;while (scanf("%d\n",&n)&&n){ans.clear();for (int i=0;i<n;++i){scanf("%c %d %d\n",&ps[i].id,&ps[i].x,&ps[i].y);}sort(ps,ps+n);//对点排序dfs(0);sort(ans.begin(),ans.end());//结果排序if(ans.size()==0){printf("Point set %d: No rectangles",cas++);}else{printf("Point set %d:\n",cas++);for (int i=0;i<ans.size();++i){if(i&&i%10==0)printf("\n");printf(" %s",ans[i].c_str());}}printf("\n");}return 0;}