夜里边切题边等电影缓冲真是太爽了..
正在慢慢的切某人切不下来的题..
1573挺简单的 以后这种模拟的数组我都从1开始就好了..省得墨迹墨迹的整的头大..
主要就是想到一个监视指针的方法..做个tester指针数组 对应map上面所有的单元
这样本来看不懂的指针地址(0x22fb18这样)就能通过查找tester来获得它的位置(tester是一个地址的数组 找到对应的 然后数数)
详见下图 ap是tester,p==0x22fb18,在ap中排第10个,则p==*(ap[9])
#include <cstdio>
#include <cstring>
typedef struct spot {
char c;
bool b;
int n;
} Spot;
Spot *p;
void move() {
switch(p->c) {
case 'N':
p-=12;
break;
case 'S':
p+=12;
break;
case 'E':
p+=1;
break;
case 'W':
p-=1;
}
}
int main() {
int i,enter,j,n,rows,cols;
Spot a[12][12];
/*Tester
Spot *(ap[3][6]);
for(i=0;i<3;i++)
for(j=0;j<7;j++)
ap[i][j]=a[i]+j;*/
while(1) {
for(i=0;i<144;i++) {
((Spot *)a+i)->c=-1;
(a[0]+i)->b=false;
}
n=0;
scanf("%d%d%d",&rows,&cols,&enter);
if(!rows&&!cols&&!enter)
return 0;
getchar();
for(i=1;i<=rows;i++) {
for(j=1;j<=cols;j++)
a[i][j].c=getchar();
getchar();
}
p=a[1]+enter;
/* TESTER
for(i=0;i<rows;i++) {
for(j=1;j<=cols;j++)
printf("%c",a[i][j].c);
printf("\n");
} */
while(1) {
p->b=true;
p->n=n;
if(p->c==-1) {
printf("%d step(s) to exit\n",n);
break;
}
move();
if(p->b) {
printf("%d step(s) before a loop of %d step(s)\n",p->n,n+1-p->n);
break;
}
n++;
}
}
return 0;
}