4
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int go[52],correct[11][52],card[52],next[52],err[11],ans[11],n,i,j,dfs,errors,best,cases,s;
void anti_shuffle(int n)
{
int tmp[52],i;
for(i=0;i<52;i++)
tmp[correct[n][i]]=next[i];
memcpy(next,tmp,sizeof(next));
}
int differents(int *a,int *b)
{
int i,j,s;
int step[52],go[52];
memset(step,0,sizeof(step));
for(i=0;i<52;i++)
go[a[i]]=b[i];
s=0;
for(i=0;i<52;i++)
if(!step[i])
{
j=i;
while(!step[j])
{
step[j]=1;
j=go[j];
s++;
}
s--;
}
return s;
}
void trytrytry(int i)
{
int j,save[52];
dfs=differents(card,correct[i]);
if(dfs>i)
return;
if(!i)
{
if(errors<best)
{
best=errors;
memcpy(ans,err,sizeof(err));
}
return;
}
memcpy(save,card,sizeof(card));
err[i]=-1;
for(j=0;j<51;j++)
{
memcpy(next,card,sizeof(card));
next[j]+=next[j+1];
next[j+1]=next[j]-next[j+1];
next[j]-=next[j+1];
dfs=differents(next,correct[i]);
anti_shuffle(1);
memcpy(card,next,sizeof(card));
errors++;
err[i]=j;
if(errors+dfs<best)
trytrytry(i-1);
errors--;
err[i]=-1;
memcpy(card,save,sizeof(card));
}
memcpy(next,card,sizeof(card));
anti_shuffle(1);
memcpy(card,next,sizeof(card));
trytrytry(i-1);
memcpy(card,save,sizeof(card));
}
int main()
{
for(i=0;i<52;i++)
{
go[i]=26*(1-i%2)+i/2;
correct[0][i]=i;
}
for(i=1;i<11;i++)
for(j=0;j<52;j++)
correct[i][j]=correct[i-1][go[j]];
scanf("%d",&s);
for(cases=1;cases<=s;cases++)
{
for(i=0;i<52;i++)
scanf("%d",&card[i]);
for(i=0;i<11;i++)
{
dfs=differents(card,correct[i]);
if(dfs<=i)
break;
}
printf("Case %d\nNumber of shuffles = %d\n",cases,i);
if(!dfs)
{
puts("No error in any shuffle\n");
continue;
}
n=i;
best=dfs+1;
errors=0;
trytrytry(i);
for(i=1;i<=n;i++)
if(ans[i]>-1)
printf("Error in shuffle %d at location %d\n",i,ans[i]);
puts("");
}
return 0;
}
5
#include<stdio.h>
#include<math.h>
int n,h[111],d[111],width,height,sum,i,di,num,level,id,cases,dh,dw,h1,m1,h2,m2;
double min,max,angle,Half_pi;
int main()
{
Half_pi=acos(0.0);
while(scanf("%d",&n)&&n)
{
scanf("%d%d",&width,&height);
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&h[i]);
d[i]=sum;
if(i<n-1)
{
scanf("%d",&di);
sum+=di+width;
}
}
printf("Apartment Complex: %d\n",++cases);
while(scanf("%d",&num)&&num)
{
printf("Apartment %d: ",num);
level=num/100-1;
id=num%100-1;
if(id<0||id>=n||level<0||level>=h[id])
{
puts("Does not exist");
continue;
}
min=0;max=0;
for(i=0;i<id;i++)
{
dw=d[id]-d[i]-width;
dh=height*(h[i]-level);
if(dh>0)
{
angle=asin(dh/((double)sqrt((double)(dh*dh+dw*dw))));
if(angle>min)
min=angle;
}
}
for(i=id+1;i<n;i++)
{
dw=d[i]-d[id]-width;
dh=height*(h[i]-level);
if(dh>0)
{
angle=asin(dh/((double)sqrt((double)(dh*dh+dw*dw))));
if(angle>max)
max=angle;
}
}
min=20220+22800*min/Half_pi;
max=65820-22800*max/Half_pi;
h1=int(min/3600);
min-=h1*3600;
m1=int(min/60);
min-=m1*60;
h2=int(max/3600);
max-=h2*3600;
m2=int(max/60);
max-=m2*60;
printf("%02d:%02d:%02d - %02d:%02d:%02d\n",h1,m1,int(min),h2,m2,int(max));
}
}
return 0;
}
6
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MaxS=500;
const int MaxN=500*2+4;
const int add[4][2]={0,1,0,-1,-1,0,1,0};
int City,xh,yh,xu,yu,n,N,q1,q2,q3,ans,i;
int coor[2][MaxS*2+4];
int w[MaxS*2+4][MaxS*2+4];
int list[MaxN*MaxN][2];
int map[MaxN][MaxN];
int find(int type,int T)
{
int l,r,m;
l=0;r=n+n+1;
while(l!=r)
{
m=(l+r)/2;
if(coor[type][m]<T)
l=m+1;
else
r=m;
}
return l;
}
bool init()
{
int i,j,k,tmp;
int streets[MaxS][4];
scanf("%d",&n);
if(n==0)
return false;
for(i=0;i<n;i++)
{
for(j=0;j<4;j++)
scanf("%d",&streets[i][j]);
coor[0][i]=streets[i][0];
coor[1][i]=streets[i][1];
coor[0][i+n]=streets[i][2];
coor[1][i+n]=streets[i][3];
}
scanf("%d %d %d %d",&xh,&yh,&xu,&yu);
coor[0][n+n]=xh;
coor[1][n+n]=yh;
coor[0][n+n+1]=xu;
coor[1][n+n+1]=yu;
sort(coor[0],coor[0]+n+n+2);
sort(coor[1],coor[1]+n+n+2);
for(i=0;i<n;i++)
{
if(streets[i][0]<streets[i][2])
{
tmp=find(0,streets[i][0])+1;
streets[i][2]=find(0,streets[i][2])+1;
streets[i][0]=tmp;
}
else
{
tmp=find(0,streets[i][2])+1;
streets[i][2]=find(0,streets[i][0])+1;
streets[i][0]=tmp;
}
if(streets[i][1]<streets[i][3])
{
tmp=find(1,streets[i][1])+1;
streets[i][3]=find(1,streets[i][3])+1;
streets[i][1]=tmp;
}
else
{
tmp=find(1,streets[i][3])+1;
streets[i][3]=find(1,streets[i][1])+1;
streets[i][1]=tmp;
}
}
xh=find(0,xh)+1;yh=find(1,yh)+1;
xu=find(0,xu)+1;yu=find(1,yu)+1;
N=n+n+3;
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
if(streets[i][0]==streets[i][2])
{
for(j=streets[i][1];j<streets[i][3];j++)
{
map[streets[i][0]][j] |=4;
map[streets[i][0]-1][j] |=8;
}
}
else
{
for(j=streets[i][0];j<streets[i][2];j++)
{
map[j][streets[i][1]] |=2;
map[j][streets[i][1]-1] |=1;
}
}
return true;
}
void go(int x,int y,int t)
{
int i,h,l;
for(i=0;i<4;i++)
if(!(map[x][y]&(1<<i)) || t)
{
h=x+add[i][0];l=y+add[i][1];
if(h<0||l<0||h>N||l>N||w[h][l])
continue;
w[h][l]=1;
list[q3][0]=h;list[q3][1]=l;
q3++;
if(map[x][y] & (1<<i))
go(h,l,t-1);
else
go(h,l,t);
}
}
int main()
{
City=0;
while(init())
{
memset(w,0,sizeof(w));
w[xh][yh]=1;
list[0][0]=xh;list[0][1]=yh;
q3=1;go(xh,yh,0);
q1=0;q2=q3;
ans=0;
while(1)
{
if(w[xu][yu])
break;
for(i=q1;i<q2;i++)
go(list[i][0],list[i][1],1);
ans++;
q1=q2;q2=q3;
}
printf("City %d\n",++City);
printf("Peter has to cross %d streets\n",ans);
}
return 0;
}
7
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char c[55],ch[5555],sequence_a[2777],sequence_b[2777];
int num[55],combo_a[2777],combo_b[2777],total[4],n,i,j,k,len,count,reverse,ok,cases;
void tr(int i,int point)
{
int j,min,step;
if(point>=len)
{
ok=1;
return;
}
if(i>2)
return;
for(j=0;j<len-point;j++)
{
step=0;
while(sequence_a[point+step]&&sequence_a[point+step]==sequence_b[j+step])
{
if(combo_a[point+step]>combo_b[j+step])
min=combo_b[j+step];
else
min=combo_a[point+step];
step+=min+1;
}
if(j+step>=len-point)
tr(i+1,point+step);
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
memset(ch,0,sizeof(ch));
memset(sequence_a,0,sizeof(sequence_a));
memset(sequence_b,0,sizeof(sequence_b));
for(i=0;i<n;i++)
scanf(" %c %d",&c[i],&num[i]);
ok=0;
for(i=0;i<n/2;i++)
{
len=0;
for(j=0;j<n;j++)
{
count=(i+j)%n;
for(k=0;k<num[count];k++)
ch[len++]=c[count];
}
count=0;
for(j=0;j<4;j++)
total[j]=0;
for(j=len/2-1;j>=0;j--)
{
sequence_a[j]=ch[j];
if(ch[j]=='N') total[0]++;
if(ch[j]=='S') total[1]++;
if(ch[j]=='W') total[2]++;
if(ch[j]=='E') total[3]++;
if(j<len/2-1 && ch[j]==ch[j+1])
count++;
else
count=0;
combo_a[j]=count;
}
count=0;
for(j=len/2;j<len;j++)
{
reverse=len-j-1;
if(ch[j]=='N')
{
sequence_b[reverse]='S';
total[1]--;
}
if(ch[j]=='S')
{
sequence_b[reverse]='N';
total[0]--;
}
if(ch[j]=='W')
{
sequence_b[reverse]='E';
total[3]--;
}
if(ch[j]=='E')
{
sequence_b[reverse]='W';
total[2]--;
}
if(j>len/2&&ch[j]==ch[j-1])
count++;
else
count=0;
combo_b[reverse]=count;
}
for(j=0;j<4;j++)
if(total[j])
break;
if(j>3)
{
len/=2;
tr(0,0);
if(ok)
break;
}
}
printf("Polygon %d: ",++cases);
if(ok)
puts("Possible");
else
puts("Impossible");
}
return 0;
}