poj.org/problem?id=3362
又是一道AC比例超低的水题,说题意有分歧有点勉强,不清楚当年发生了什么。。。
题目倒是挺有趣的, 24hour是我以前热追的美剧
思路很简单,直接模拟
1. 记录每个位置上点的个数,如果某一时刻,点0坐在位置上所有点的个数等于点的总数,则检测到恐怖袭击
2. 每个点按照X..FLFLFL...交替的顺序寻找下一个位置, X是起始的方向
3. 除了第一次移动,F/L对应的实际方向由当前位置和前一次位置决定,这时候如果没有前一次位置那么点就保持不动
模拟的最长次数是24*3,非常小,所以每个点都可以维护一个栈来记录路径,当无路可走时就出站,有路走时则入栈,每移动一次更新相应位置的点的个数
实现
for (i=1; i<=4; i++) for (j=1; j<=4; j++) cs[i][j]=0;
scanf("%d", &n); if (n==0||n>MAXN) assert(0);
for (k=0; k<n; k++) {
p=ib; while(1) {
if (scanf("%s", p)!=1) assert(0);
i=0; while(p[i]&&p[i]!='F'&&p[i]!='L') i++;
o=p[i]; if (o) break; p+=i;
}
p=ib; i=0; while(p[i]&&(p[i]<'0'||p[i]>'9')) i++; if(p[i]==0) assert(0);
x=0; while(p[i]>='0'&&p[i]<='9') x=x*10+p[i++]-'0';
while(p[i]&&(p[i]<'0'||p[i]>'9')) i++; if(p[i]==0) assert(0);
y=0; while(p[i]>='0'&&p[i]<='9') y=y*10+p[i++]-'0';
// if (ti==23) printf("%s\n", ib);
if (x<1||x>4||y<1||y>4) assert(0);
cs[x][y]++;
pc[k]=1; pm[k]=o; pp[k][0].x=x; pp[k][0].y=y;
frz[k]=0;
}
if (cs[x][y]==n) { printf("Case %d: %d, %d, 800\n", ti, x, y); continue; }
dt=20; for (i=0; i<n; i++) {
x=pp[i][0].x; y=pp[i][0].y;
cs[x][y]--;
if (pm[i]=='F') {
y--; if (y<1) { y++; frz[i]=1; } else {
pc[i]++; pp[i][1].x=x; pp[i][1].y=y; pm[i]='L';
}
} else {
x--; if (x<1) { x++; frz[i]=1; } else {
pc[i]++; pp[i][1].x=x; pp[i][1].y=y; pm[i]='F';
}
}
cs[x][y]++;
}
while(dt<24*60) {
m=pc[0]; x=pp[0][m-1].x; y=pp[0][m-1].y;
if (cs[x][y]==n) break;
// printf("%d:\n", dt);
for (i=0; i<n; i++) {
m=pc[i];
if (frz[i]||m==1) continue;
x=pp[i][m-1].x; y=pp[i][m-1].y;
// printf("%d start with %d,%d\n", i, x, y);
cs[x][y]--;
if (pm[i]=='F') {
pm[i]='L';
dx=x-pp[i][m-2].x; dy=y-pp[i][m-2].y;
nx=dx+x; ny=dy+y;
if (nx<1||nx>4||ny<1||ny>4) {
if (dx==1) { dx=0; dy=-1; }
else if (dx==-1) { dx=0; dy=1; }
else if (dy==1) { dy=0; dx=1; }
else if (dy==-1) { dy=0; dx=-1; }
else assert(0);
nx=dx+x; ny=dy+y;
}
} else {
pm[i]='F';
dx=x-pp[i][m-2].x; dy=y-pp[i][m-2].y;
if (dx==1) { dx=0; dy=-1; }
else if (dx==-1) { dx=0; dy=1; }
else if (dy==1) { dy=0; dx=1; }
else if (dy==-1) { dy=0; dx=-1; }
else assert(0);
nx=dx+x; ny=dy+y;
}
if (nx<1||nx>4||ny<1||ny>4) {
pc[i]--; x=pp[i][m-2].x; y=pp[i][m-2].y;
} else {
x=nx; y=ny;
pp[i][m].x=x; pp[i][m].y=y; pc[i]++;
}
// printf("%d ===> %d,%d\n", i, x, y);
cs[x][y]++;
}
dt+=20;
}
dt+=8*60;
if (dt>=24*60) printf("Case %d: no terror threat\n", ti);
else {
m=pc[0]; x=pp[0][m-1].x; y=pp[0][m-1].y;
printf("Case %d: %d, %d, %d%02d\n", ti, x, y, (dt/60)%24, dt%60);
}
其实,开始看到ac比例这么低我是比较谨慎的,随机生成了几组数据在udebug上查看输出进行对比,但是总有些数据对不上,后来抱着试一试的心态提交,没想到居然1A.。。。可能是数据弱+我的理解没有太偏。。。。。