据说可以用动态规化解,想不出来就用爆搜结果过了。
输出格式让我纠结了很久一直WA
#include<cstdio>
#include<cstring>
#define MAX 27
struct edge{
int x,y;
char tag;
};
edge edges[MAX];
int p[4];
bool vis[MAX];
int num;
bool flag;
int ansnum=0;
bool canput(edge a, int b)
{
switch(b)
{
case 0: return true;
case 1: if(a.y==edges[p[0]].y&&a.x>edges[p[0]].x)return true ;
else return false ;
case 2: if(a.x==edges[p[1]].x&&a.y<edges[p[1]].y) return true ;
else return false ;
case 3: if(a.x==edges[p[0]].x&&a.y==edges[p[2]].y) return true;
else return false;
}
}
void dfs(int n )
{
int i,j;
if(n==4)
{
if(++ansnum>10)
{printf("\n");
ansnum=1;
}
if(flag) printf("\n");
printf(" ");
for(j=0; j<4; j++)
{
printf("%c",edges[p[j]].tag);
}
flag=false;
return ;
}
for(i=0; i<num; i++)
{
if(!vis[i]&&canput(edges[i],n))
{
vis[i]=true;
p[n]=i;
dfs(n+1);
vis[i]=false;
}
}
}
int main()
{
int no=0;
int i;
while(scanf("%d",&num),num)
{
getchar();
no++;
for( i=0; i<num; i++)
{
scanf("%c %d %d",&edges[i].tag,&edges[i].x,&edges[i].y);
getchar();
}
memset(vis,0,sizeof(vis));
flag=true;
ansnum=0;
printf("Point set %d:",no);
dfs(0);
if(flag)
printf(" No rectangles\n");
else
printf("\n");
}
return 0;
}