题目简述就是推棋子走棋盘(不能出棋盘),然后经历一系列花里胡哨的操作以后 判断位置
话不多说 代码如下
#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代码了