Right turn bunoj
2016-07-06 19:33
323 查看
关于转向的问题内什么难度就是写的时候思路要清晰 附带俩种代码 从时间上相差无几 但是从代码上明显自己写的更加复杂,也不知道当时为啥那么想,也许只是想用用新学的MAP存;
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
//#include <memset>
#include <algorithm>
using namespace std;
#define N 1105
#define mod 19999997
#define LL long long
const int INF = 0xfffffffffffff;
#define exp 1e-8
struct fx
{
LL x,y,len;
}q;
map<LL,LL> vx;
map<LL,LL> vy;
queue<fx>Q;
LL ax
,ay
,b[1011][7],cx[1011],cy[1011],p;
int main()
{
LL t,i,j,l,w;
LL n,m,k,sum,l1,w1;
while(~scanf("%lld",&t))
{
sum=0;
while(!Q.empty())
Q.pop();
q.x=1;q.y=0;q.len=1;
Q.push(q);
q.x=0;q.y=-1;q.len=2;
Q.push(q);
q.x=-1;q.y=0;q.len=3;
Q.push(q);
q.x=0;q.y=1;q.len=4;
Q.push(q);
memset(b,0,sizeof(b));
memset(cx,0,sizeof(cx));
memset(cy,0,sizeof(cy));
vx.clear();
vy.clear();
LL numx=1,numy=1;
for(int i=0;i<t;i++)
{
scanf("%lld%lld",&l,&w);//printf("%lld",cx[i]);
if(vx[l]!=NULL)
;
else
vx[l]=numx++;
if(vy[w]!=NULL)
;
else
vy[w]=numy++;
ax[vx[l]][cx[vx[l]]]=w;
ay[vy[w]][cy[vy[w]]]=l;
cx[vx[l]]++;
cy[vy[w]]++;
}
for(int i=0;i<=t;i++)
{
sort(ax[i],ax[i]+cx[i]);
}
for(int i=0;i<=t;i++)
sort(ay[i],ay[i]+cy[i]);
l=w=0;
LL jj=1;
p=0;
LL lw=0;
while(jj)
{
lw=1;
LL ll;
q=Q.front();
Q.pop();
Q.push(q);
if(q.len==1)
{
ll=vy[w];
for(int i=0;i<cy[ll];i++)
{
if(ay[ll][i]>l)
{
l=ay[ll][i]-1;
/* if(b[ll][q.len]==1)
{
// printf("ss");
p=1;
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==2)
{
ll=vx[l];
for(int i=cx[ll]-1;i>=0;i--)
{
if(ax[ll][i]<w)
{
w=ax[ll][i]+1;
/* if(b[ll][q.len]==1)
{
// printf("ss");
p=1;
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==3)
{
ll=vy[w];
for(int i=cy[ll]-1;i>=0;i--)
{
if(ay[ll][i]<l)
{
l=ay[ll][i]+1;
/* if(b[ll][q.len]==1)
{
p=1;
//printf("ss");
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==4)
{
ll=vx[l];
for(int i=0;i<cx[ll];i++)
{
if(ax[ll][i]>w)
{
w=ax[ll][i]-1;
/* if(b[ll][q.len]==1)
{
//printf("ss");
p=1;
jj=0;
break;
}
b[ll][q.len]=1;*/
lw=0;
sum++;
break;
}
}
}
//printf("%lld %lld\n",l,w);
if(sum>4*t)
{
p=1;
break;
}
if(lw==1)
break;
}
// printf("%lld.",p);
if(p==1)
{
printf("-1\n");
}
else
printf("%lld\n",sum);
}
return 0;
}
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
//#include <memset>
#include <algorithm>
using namespace std;
#define N 1105
#define mod 19999997
#define LL long long
const int INF = 0xfffffffffffff;
#define exp 1e-8
struct fx
{
LL x,y,len;
}q;
map<LL,LL> vx;
map<LL,LL> vy;
queue<fx>Q;
LL ax
,ay
,b[1011][7],cx[1011],cy[1011],p;
int main()
{
LL t,i,j,l,w;
LL n,m,k,sum,l1,w1;
while(~scanf("%lld",&t))
{
sum=0;
while(!Q.empty())
Q.pop();
q.x=1;q.y=0;q.len=1;
Q.push(q);
q.x=0;q.y=-1;q.len=2;
Q.push(q);
q.x=-1;q.y=0;q.len=3;
Q.push(q);
q.x=0;q.y=1;q.len=4;
Q.push(q);
memset(b,0,sizeof(b));
memset(cx,0,sizeof(cx));
memset(cy,0,sizeof(cy));
vx.clear();
vy.clear();
LL numx=1,numy=1;
for(int i=0;i<t;i++)
{
scanf("%lld%lld",&l,&w);//printf("%lld",cx[i]);
if(vx[l]!=NULL)
;
else
vx[l]=numx++;
if(vy[w]!=NULL)
;
else
vy[w]=numy++;
ax[vx[l]][cx[vx[l]]]=w;
ay[vy[w]][cy[vy[w]]]=l;
cx[vx[l]]++;
cy[vy[w]]++;
}
for(int i=0;i<=t;i++)
{
sort(ax[i],ax[i]+cx[i]);
}
for(int i=0;i<=t;i++)
sort(ay[i],ay[i]+cy[i]);
l=w=0;
LL jj=1;
p=0;
LL lw=0;
while(jj)
{
lw=1;
LL ll;
q=Q.front();
Q.pop();
Q.push(q);
if(q.len==1)
{
ll=vy[w];
for(int i=0;i<cy[ll];i++)
{
if(ay[ll][i]>l)
{
l=ay[ll][i]-1;
/* if(b[ll][q.len]==1)
{
// printf("ss");
p=1;
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==2)
{
ll=vx[l];
for(int i=cx[ll]-1;i>=0;i--)
{
if(ax[ll][i]<w)
{
w=ax[ll][i]+1;
/* if(b[ll][q.len]==1)
{
// printf("ss");
p=1;
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==3)
{
ll=vy[w];
for(int i=cy[ll]-1;i>=0;i--)
{
if(ay[ll][i]<l)
{
l=ay[ll][i]+1;
/* if(b[ll][q.len]==1)
{
p=1;
//printf("ss");
jj=0;
break;
}*/
b[ll][q.len]=1;
sum++;
lw=0;
break;
}
}
}
else if(q.len==4)
{
ll=vx[l];
for(int i=0;i<cx[ll];i++)
{
if(ax[ll][i]>w)
{
w=ax[ll][i]-1;
/* if(b[ll][q.len]==1)
{
//printf("ss");
p=1;
jj=0;
break;
}
b[ll][q.len]=1;*/
lw=0;
sum++;
break;
}
}
}
//printf("%lld %lld\n",l,w);
if(sum>4*t)
{
p=1;
break;
}
if(lw==1)
break;
}
// printf("%lld.",p);
if(p==1)
{
printf("-1\n");
}
else
printf("%lld\n",sum);
}
return 0;
}
相关文章推荐
- <个人博客网站开通啦!!!>
- Android 四大组件之Service 的生命周期与启动Service
- Activity之间带返回值传递小例子
- POJ 1740 A New Stone Game
- public interface Lock源码探索
- hibernate中对象状态
- 启动新内核出现:No filesystem could mount root, tried: ext3 ext2 cramfs vfa
- 华为机试题-判断二进制中0的个数【4】
- 华为机试题-判断二进制中0的个数【4】
- 华为机试题-判断二进制中0的个数【4】
- 华为机试题-判断二进制中0的个数【4】
- C++时间与字符串转换
- 停车收费平板软件
- java面试宝典
- 各种资源网址
- android ndk开发之Log日志(二)
- 113---如何整合SSH框架
- django 将删除的表重新生成
- 整合Open vSwitch与DNSmasq为虚拟机提供DHCP功能
- mysql版本问题sql_mode=only_full_group_by