zoj 1179 Finding Rectangles
2013-08-25 21:44
316 查看
据说可以用动态规化解,想不出来就用爆搜结果过了。
输出格式让我纠结了很久一直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
=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;
}
输出格式让我纠结了很久一直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
=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;
}
相关文章推荐
- ZOJ 1179 Finding Rectangles(DFS+剪枝)
- ZOJ-1179
- zoj 3607 Lazier Salesgirl
- ZOJ 3757 Alice and Bod 模拟
- zoj 1560 Hansel and Grethel(求两条直线的交点)
- ZOJ 3963 Heap Partition( 并查集 + 贪心 +二分 )
- zoj 1610 Count the Colors【线段树】
- zoj训练路线
- uva 10129 poj 1386 hdu 1116 zoj 2016 play on words
- zoj 3229 Shoot the Bullet(有源汇上下界最大流)
- ZOJ1508 POJ1201 HDU1384 Intervals
- ZOJ 3705 Applications
- Zoj 3870 Team Formation(异或运算)
- ZOJ 3964 Yet Another Game of Stones(博弈论)
- ZOJ 3593
- [ACM_水题] ZOJ 3714 [Java Beans 环中连续m个数最大值]
- ZOJ 3878 Convert QWERTY to Dvorak (The 12th Zhejiang Provincial Collegiate Programming Contest)
- ZOJ 3822 Domination 概率DP
- zoj 1360 || poj 1328 Radar Installation
- zoj 1539 Lot