夜里边切题边等电影缓冲真是太爽了..
正在慢慢的切某人切不下来的题..
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; }