为啥这个2显示出来路径不正确啊?
  • 板块学术版
  • 楼主Yue_Hao
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/3 21:28
  • 上次更新2024/10/4 07:02:49
查看原帖
为啥这个2显示出来路径不正确啊?
1378709
Yue_Hao楼主2024/10/3 21:28

我想搞一个能让'2'用指令的方式进行移动,并且将路径保留下来(类似Python的turtle库),尝试用C++的数组实现,但是这个转弯的部分我不太会,dalao们能指点一下吗?谢谢


#include <bits/stdc++.h>
using namespace std;
long long INF = 0x7fffffff;
int a[32][32];


void fd(int x){
	int dx, dy;
	for(int i = 0; i <= 32; i++){
		for(int j = 0; j <= 32; j++){
			if(a[i][j] == 2){
				dx = i;
				dy = j;
			}
		}
	}
	if(dx + x > 32){
		a[dx][dy] = 1;
		a[32][dy] = 2;
		for(int i = 1; i < x && (dx + i) <= 32; i++) if(a[dx + x][dy] != 2) a[dx + i][dy] = 1;
	}else{
		a[dx][dy] = 1;
		a[dx - x][dy] = 2;
		for(int i = 1; i < x; i++) a[dx - i][dy] = 1;
	}
}



void back(int x){
	int dx, dy;
	for(int i = 0; i <= 32; i++){
		for(int j = 0; j <= 32; j++){
			if(a[i][j] == 2){
				dx = i;
				dy = j;
			}
		}
	}
	if(dx + x > 32){
		a[dx][dy] = 1;
		a[32][dy] = 2;
		for(int i = 1; i < x && (dx + i) <= 32; i++) if(a[dx + x][dy] != 2) a[dx + i][dy] = 1;
	}else{
		a[dx][dy] = 1;
		a[dx - x][dy] = 2;
		for(int i = 1; i < x; i++) a[dx - i][dy] = 1;
	}
}



void left(int y, int jd){
	int dx, dy;
	for(int i = 0; i <= 32; i++){
		for(int j = 0; j <= 32; j++){
			if(a[i][j] == 2){
				dx = i;
				dy = j;
			}
		}
	}
	if(jd == 90){
		if(dy - y < 0){
			a[dx][0] = 2;
			a[dx][dy] = 1;
			for(int i = 1; i < y && (dy - y) >= 0; i++) if(a[dx][dy - y] != 2) a[dx][dy - i] = 1;
		}else{
			a[dx][dy - y] = 2;
			a[dx][dy] = 1;
			for(int i = 1; i < y; i++) a[dx][dy - i] = 1;
		}
	}else if(jd == -90){
		if(dy + y > 32){
			a[dx][32] = 2;
			a[dx][dy] = 1;
			for(int i = 1; i < y && (dy + y) <= 32; i++) if(a[dx][dy + i] != 2) a[dx][dy + i] = 1;
		}else{
			a[dx][dy - y] = 2;
			a[dx][dy] = 1;
			for(int i = 1; i < y; i++) a[dx][dy + i] = 1;
		}
	}else if(jd == 45){
		
		if(dx + y > 32 || dy - y < 0){
			a[dx][0] = 1;
			if(dx + y > 32){
				int oooooo;
				for(oooooo = 1; oooooo <= y; oooooo++){
					if(dx + oooooo <= 32) a[dx + oooooo][dy + oooooo] = 1;
					else a[32][oooooo] = 1;
				}
				a[32][oooooo] = 2;
			}else if(dy - y < 0){
				int oooooo;
				for(oooooo = 1; oooooo <= y; oooooo++){
					if(dy + oooooo <= 32) a[dx + oooooo][dy - oooooo] = 1;
					a[dx + oooooo][0] = 1;
				}
				a[oooooo][0] = 2;
			}else if(dx + y > 32 && dy - y < 0){
				int oooooo;
				for(oooooo = 1; oooooo <= y; oooooo++){
					if(dx + oooooo <= 32 && dy + oooooo <= 32) a[dx + oooooo][dy - oooooo] = 1;
					else if(dx + oooooo > 32 && dy + oooooo <= 32) a[32][dy - oooooo] = 1;
					else if(dx + oooooo <= 32 && dy + oooooo > 32) a[dx + oooooo][0] = 1;
					else break;
				}
				a[32][32] = 2;
			}else{
				int oooooo;
				for(oooooo = 1; oooooo <= y; oooooo++) a[dx + oooooo][dy - oooooo] = 1;
				a[dx + oooooo][dy - oooooo] = 2;
			}
		}
	}else if(jd == -45){
		int sp;
		for(sp = 1; sp <= y; sp++){
			if(dx + sp >= 0 && dy + sp >= 0) a[dx + sp][dy + sp] = 1;
			else if(dx + sp >= 0 && dy + sp < 0) a[dx + sp][0] = 1;
			else if(dx + sp < 0 && dy + sp >= 0) a[0][dy + sp] = 1;
			else break;
		}
		a[0][0] = 2;
	}
}




void right(int y, int jd){
	int dx, dy;
	for(int i = 0; i <= 32; i++){
		for(int j = 0; j <= 32; j++){
			if(a[i][j] == 2){
				dx = i;
				dy = j;
			}
		}
	}
	if(jd == 90){
		if(dy + y > 32){
			int i;
			for(i = 1; i <= y && (dy + i <= 32); i++) a[dx][dy + i] = 1;
			a[dx][dy + i] = 2;
		}else{
			int i;
			for(i = 1; i <= y; i++) a[dx][dy + i] = 1;
			a[dx][dy + i] = 2;
		}
	}else if(jd == 45){
		int i;
		for(i = 1; i <= y; i++){
			if(dx + i <= 32 && dy + i <= 32) a[dx + i][dy + i] = 1;
			else if(dx + i > 32 && dy + i <= 32) a[32][dy + i] = 1;
			else if(dx + i <= 32 && dy + i > 32) a[dx + i][32] = 1;
			else break;
		}
		a[32][32] = 2;
	}else if(jd == -45){
		int i;
		for(i = 1; i <= y; i++){
			if(dx - i >= 0 && dy + i <= 32) a[dx - i][dy + i] = 1;
			else if(dx - i < 32 && dy + i <= 32) a[32][dy + i] = 1;
			else if(dx - i >= 0 && dy + i > 32) a[dx - i][32] = 1;
			else break;
		}
		a[0][32] = 2;
	}
}




int main(){
	a[16][16] = 2;
	int n, bx, jiaodu;
	string tmp;
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		cin >> tmp;
		cin >> bx;
		if(tmp == "fd") fd(bx);
		else if(tmp == "back") back(bx);
		else if(tmp == "left"){
			scanf("%d", &jiaodu);
			left(bx, jiaodu);
		}else if(tmp == "right"){
			scanf("%d", &jiaodu);
			right(bx, jiaodu);
		}else printf("语法错误");
	}
	for(int i = 0; i <= 32; i++){
		for(int j = 0; j <= 32; j++){
			printf("%d", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}
2024/10/3 21:28
加载中...