今天写了一道模拟题题目其实不难但是中间有很多细节容易写错,在加上代码量比较大也不好改bug,因为我比较菜的原因找了很久才找出bug。其中有几个细节需要注意一下一是起点坐标1,1应该是在左下角,二是每跑一格都应该去更新它的状态。代码如下。
#include<iostream>
using namespace std;
const int N=1002;
char a[N][N],b[10*N],go[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
struct node{
int x,y,z1,z2,z3;
}c[10*N];
int main(){
int i,j,m,n,k,flag=0;
scanf("%d%d",&n,&m);
for(i=n;i>=1;i--){
for(j=1;j<=m;j++){
cin>>a[i][j];
}
}
c[0].x=1,c[0].y=1;
scanf("%d",&k);
if(k!=0){
scanf("%s",b);
}else{
getchar();
}
if(a[1][1]=='#'||k==0){
printf("1 1");
}else{
if(a[1][1]=='1'){
c[0].z1=5;
}else if(a[1][1]=='2'){
c[0].z2=5;
}else if(a[1][1]=='3'){
c[0].z3=5;
}
a[1][1]='0';
for(i=0;i<k;i++){
int ty,tx;
j=b[i]-'0';
if(c[i].z1==0&&c[i].z2==0&&c[i].z3==0){
if(a[c[i].y][c[i].x]=='#'){
flag=1;
printf("%d %d",c[i].x,c[i].y);
break;
}
tx=c[i].x+go[j][0];
ty=c[i].y+go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='#'){
c[i+1].x=c[i].x,c[i+1].y=c[i].y;
}else if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}else if(c[i].z1&&c[i].z2==0&&c[i].z3==0){
if(a[c[i].y][c[i].x]=='#'){
flag=1;
printf("%d %d",c[i].x,c[i].y);
break;
}
c[i+1].z1=c[i].z1-1;
tx=c[i].x-go[j][0];
ty=c[i].y-go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='#'){
c[i+1].x=c[i].x,c[i+1].y=c[i].y;
}else if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}else if(c[i].z1==0&&c[i].z2&&c[i].z3==0){
if(a[c[i].y][c[i].x]=='#'){
flag=1;
printf("%d %d",c[i].x,c[i].y);
break;
}
c[i+1].z2=c[i].z2-1;
for(int w=1;w<=2;w++){
if(w==2&&c[i+1].y==c[i].y&&c[i+1].x==c[i].x){
break;
}
tx=c[i].x+w*go[j][0];
ty=c[i].y+w*go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='#'){
c[i+1].x=tx-go[j][0],c[i+1].y=ty-go[j][1];
while(c[i+1].x>m){
c[i+1].x-=m;
}
while(c[i+1].y<1){
c[i+1].y+=m;
}
while(c[i+1].y<1){
c[i+1].y+=n;
}
while(c[i+1].x>n){
c[i+1].x-=n;
}
}else if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}
}else if(c[i].z1==0&&c[i].z2==0&&c[i].z3){
c[i+1].z3=c[i].z3-1;
tx=c[i].x+2*go[j][0];
ty=c[i].y+2*go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}else if(c[i].z1&&c[i].z2&&c[i].z3==0){
if(a[c[i].y][c[i].x]=='#'){
flag=1;
printf("%d %d",c[i].x,c[i].y);
break;
}
c[i+1].z2=c[i].z2-1;
c[i+1].z1=c[i].z1-1;
for(int w=1;w<=2;w++){
if(w!=1&&c[i+1].y==c[i].y&&c[i+1].x==c[i].x){
break;
}
tx=c[i].x-w*go[j][0];
ty=c[i].y-w*go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='#'){
c[i+1].x=tx+go[j][0],c[i+1].y=ty+go[j][1];
while(c[i+1].x>m){
c[i+1].x-=m;
}
while(c[i+1].y<1){
c[i+1].y+=m;
}
while(c[i+1].y<1){
c[i+1].y+=n;
}
while(c[i+1].x>n){
c[i+1].x-=n;
}
}else if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}
}else if(c[i].z1==0&&c[i].z2&&c[i].z3){
c[i+1].z3=c[i].z3-1;
c[i+1].z2=c[i].z2-1;
tx=c[i].x+4*go[j][0];
ty=c[i].y+4*go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}else if(c[i].z1&&c[i].z2==0&&c[i].z3){
c[i+1].z3=c[i].z3-1;
c[i+1].z1=c[i].z1-1;
tx=c[i].x-2*go[j][0];
ty=c[i].y-2*go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}else if(c[i].z1&&c[i].z2&&c[i].z3){
c[i+1].z3=c[i].z3-1;
c[i+1].z1=c[i].z1-1;
c[i+1].z2=c[i].z2-1;
tx=c[i].x-4*go[j][0];
ty=c[i].y-4*go[j][1];
while(tx>m){
tx-=m;
}
while(tx<1){
tx+=m;
}
while(ty<1){
ty+=n;
}
while(ty>n){
ty-=n;
}
if(a[ty][tx]=='1'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z1=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='2'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z2=5;
a[ty][tx]='0';
}else if(a[ty][tx]=='3'){
c[i+1].x=tx,c[i+1].y=ty,c[i+1].z3=5;
a[ty][tx]='0';
}else{
c[i+1].x=tx,c[i+1].y=ty;
}
}
// printf("%d %d:%d %d %d\n",c[i].x,n-c[i].y+1,c[i].z1,c[i].z2,c[i].z3);
}
if(flag==0){
printf("%d %d",c[k].x,c[k].y);
}
}
return 0;
}