三期集训第二天总结

这篇博客介绍了一段C++代码,用于解决一个涉及网格路径搜索和状态更新的问题。代码中注意了起点坐标位于左下角,并且在每一步移动后更新单元格的状态。程序处理了多种边界条件和不同符号的交互,涉及到递归或循环的复杂逻辑。
摘要由CSDN通过智能技术生成

今天写了一道模拟题题目其实不难但是中间有很多细节容易写错,在加上代码量比较大也不好改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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值