题目简述就是推棋子走棋盘(不能出棋盘),然后经历一系列花里胡哨的操作以后 判断位置

话不多说 代码如下

#include<bits/stdc++.h>
using namespace std;
char a[10][10];
char b[6];//操作的前一串
char c[6];//操作的后一串
int fangxiang;//你的朝向 1↑ 2↓ 3← 4→
int x,y;
void yidong(int x, int y) { //移动
	if(x<1||x>8||y<1||y>8)
		return;//到达边界时就不再操作
	if(fangxiang==1) {
		if(a[x-1][y])
			yidong(x-1,y);
		a[x-1][y]=a[x][y];//替换坐标位置
		a[x][y]=0;//原来位置化0
	}
	if(fangxiang==2) {
		if(a[x+1][y])
			yidong(x+1,y);//到达边界时就不再操作
		a[x+1][y]=a[x][y];//替换坐标位置
		a[x][y]=0;//原来位置化0
	}
	if(fangxiang==3) {
		if(a[x][y-1])
			yidong(x,y-1);//到达边界时就不再操作
		a[x][y-1]=a[x][y];//替换坐标位置
		a[x][y]=0;//原来位置化0
	}
	if(fangxiang==4) {
		if(a[x][y+1])
			yidong(x,y+1);//到达边界时就不再操作
		a[x][y+1]=a[x][y];//替换坐标位置
		a[x][y]=0;//原来位置化0
	}
}
void move(int n) {
	if(fangxiang==1) {//上
		for(int i=1; i<=n; i++) {
			if(x==1) continue;//到达边界时就不再操作
			if(a[x-1][y])
				yidong(x-1,y);
			x--;
		}
	}
	if(fangxiang==2)//下
		for(int i=1; i<=n; i++) {
			if(x==8) continue;//到达边界时就不再操作
			if(a[x+1][y])
				yidong(x+1,y);
			x++;
		}
	if(fangxiang==3)//左
		for(int i=1; i<=n; i++) {
			if(y==1)continue;//到达边界时就不再操作
			if(a[x][y-1])
				yidong(x,y-1);
			y--;
		}
	if(fangxiang==4)//右
		for(int i=1; i<=n; i++) {
			if(y==8)continue;//到达边界时就不再操作
			if(a[x][y+1])
				yidong(x,y+1);
			y++;
		}
}
int main() {
	for(int i=1; i<=8; i++)
		for(int j=1; j<=8; j++) {
			cin>>a[i][j];
			if(a[i][j]=='.')
				a[i][j]=0;//将“.”清为零,好做以后的操作
			if(a[i][j]=='^') {
				x=i;
				y=j;
				//记录当前坐标
				fangxiang=1;
				//记录当前方向
				a[i][j]=0;
				//当前坐标录入后记得清零
			}
			if(a[i][j]=='v') {
				x=i;
				y=j;
				fangxiang=2;
				a[i][j]=0;
			}
			if(a[i][j]=='<') {
				x=i;
				y=j;
				fangxiang=3;
				a[i][j]=0;
			}
			if(a[i][j]=='>') {
				x=i;
				y=j;
				fangxiang=4;
				a[i][j]=0;
			}
		}
	//操作输入
	while(cin>>b) {
		if(b[0]=='#')break;
		if(b[0]=='m') {
			int n;
			cin>>n;
			move(n);//移动
		} else if(b[0]=='t') {
			cin>>c;//1↑ 2↓ 3← 4→
			if(c[0]=='l') {//向左转
				if(fangxiang==1)
					fangxiang=3;
				else if(fangxiang==2)
					fangxiang=4;
				else if(fangxiang==3)
					fangxiang=2;
				else if(fangxiang==4)
					fangxiang=1;
			}
			if(c[0]=='r') {//向右转
				if(fangxiang==1)
					fangxiang=4;
				else if(fangxiang==2)
					fangxiang=3;
				else if(fangxiang==3)
					fangxiang=1;
				else if(fangxiang==4)
					fangxiang=2;
			}
			if(c[0]=='b') {//向后转
				if(fangxiang==1)
					fangxiang=2;
				else if(fangxiang==2)
					fangxiang=1;
				else if(fangxiang==3)
					fangxiang=4;
				else if(fangxiang==4)
					fangxiang=3;
			}
		}
	}
	for(int i=1; i<=8; i++) {
		for(int j=1; j<=8; j++) {
			if(i==x&&j==y) { //如果a[i][j]是我们现在位置的话
				if(fangxiang==1)
					cout<<"^";
				if(fangxiang==2)
					cout<<"v";
				if(fangxiang==3)
					cout<<"<";
				if(fangxiang==4)
					cout<<">";
				continue;
			}
			//如果a[i][j]为空
			if(a[i][j]==0)
				cout<<".";
			//不然a[i][j]就是字母。
			else cout<<a[i][j];
		}
		cout<<endl;
	}
	return 0;
}

 一开始在做的时候没有考虑一个问题 所以没有AC 原因如下:

因为"如果面前有棋子,则将其向前推一步。"

但是题目没提到的是

如果你的前面有棋子,棋子的前面也有棋子。

棋子要一起向前推。

所以加上一个将棋子的前面的棋子也向前推的函数

后来加上了 所以就是上面的AC代码了

 

posted on 2020-04-18 01:37  月下诺  阅读(210)  评论(0编辑  收藏  举报

Live2D