NC207619. 推箱子
描述
输入描述
第一行包含一个整数 T ( 1 ≤ T ≤ 10 ) 表示共有T组测试样例;
输入前 10 行,每行10个字符,给出棋盘状态。“.”表示该格为空,“@”表示人,字母表示的箱子。
接下来每组的第一行有一个整数 k ( 1 ≤ k ≤ 1000 ) k 为操作数
接下来 k 行,每行一个操作( 1 ≤ x ≤ 10 )
输出描述
输出 10 * 10 的地图状态
示例1
输入:
1 .......... .......... .......... .......... .......... .......... .....@.... .........a .........b .........c 4 turn left move 8 turn left move 1
输出:
b......... a......... @......... .......... .......... .......... .......... .......... .......... ..........
C++14(g++5.4) 解法, 执行用时: 7ms, 内存消耗: 492K, 提交时间: 2020-06-07 16:23:52
#include<bits/stdc++.h> using namespace std; #define INF 1000000000 char maps[15][15]; int dx[4]={-1,0,1,0}, dy[4]={0,-1,0,1}; void push(int dir,int x,int y){ if(x<0||x>=10||y<0||y>=10) return; int ax = x-dx[dir], ay = y-dy[dir]; if(maps[x][y]!='.'){ push(dir,x+dx[dir],y+dy[dir]); } maps[x][y]=maps[ax][ay]; } int main(){ int T, n; scanf("%d",&T); while(T--){ int nx, ny; for(int i = 0;i < 10;i++){ scanf("%s",maps[i]); } for(int i = 0;i < 10;i++) for(int j = 0;j < 10;j++) if(maps[i][j]=='@'){ nx = i, ny = j; } int k; scanf("%d",&k); getchar(); int dir=0; while(k--){ char str[15]; scanf("%s",str); if(str[0]=='t'){ scanf("%s",str); if(str[0]=='l') dir=(dir+3)%4; else if(str[0]=='r') dir=(dir+1)%4; else dir = (dir+2)%4; } else{ int x; scanf("%d",&x); for(int i = 0;i < x;i++){ int ax = nx+dx[dir], ay = ny+dy[dir]; if(ax>=0&&ax<10&&ay>=0&&ay<10){ push(dir,ax,ay); maps[nx][ny]='.'; nx=ax;ny=ay; } } } } if(dir==0){ for(int i = 0;i <10;i++) printf("%s\n",maps[i]); } else if(dir==1){ for(int j = 0;j<10;j++){ for(int i = 9;i >= 0;i--) printf("%c",maps[i][j]); printf("\n"); } } else if(dir==2){ for(int i = 9;i>=0;i--){ for(int j = 9;j >= 0;j--) printf("%c",maps[i][j]); printf("\n"); } } else{ for(int j = 9;j>=0;j--){ for(int i = 0;i < 10;i++) printf("%c",maps[i][j]); printf("\n"); } } } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 9ms, 内存消耗: 504K, 提交时间: 2020-06-07 15:14:50
#include <iostream> #include <algorithm> using namespace std; char mp[20][20]; int t,q,a,dr; char cmd[20]; struct dir{ int x,y; dir operator +(dir dx){ return (dir){x+dx.x,y+dx.y}; } bool safe(){ if(x<0||y<0||x>=10||y>=10)return false; return true; } }dft[4]={-1,0,0,1,1,0,0,-1},vct,quana; dir fnd(){ for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(mp[i][j]=='@') return (dir){i,j}; } void mov(char c,dir pos){ if(!pos.safe())return; if(mp[pos.x][pos.y]!='.')mov(mp[pos.x][pos.y],pos+dft[dr]); mp[pos.x][pos.y]=c; } void gogogo(){ dir stp=quana+dft[dr]; if(!stp.safe())return; mov('@',stp); mp[quana.x][quana.y]='.'; quana=stp; } int main(){ cin>>t; while(t--){ dr=0; for(int i=0;i<10;i++)cin>>mp[i]; quana=fnd(); vct=dft[0]; cin>>q; while(q--){ cin>>cmd; if(cmd[0]=='t'){ cin>>cmd; if(cmd[0]=='l')dr+=1; else if(cmd[0]=='r')dr+=3; else dr+=2; dr%=4; } else{ cin>>a; while(a--)gogogo(); } } switch(dr){ case 0: for(int i=0;i<10;i++){ for(int j=0;j<10;j++)printf("%c",mp[i][j]); printf("\n"); } break; case 1: for(int j=9;j>=0;j--){ for(int i=0;i<10;i++)printf("%c",mp[i][j]); printf("\n"); } break; case 2: for(int i=9;i>=0;i--){ for(int j=9;j>=0;j--)printf("%c",mp[i][j]); printf("\n"); } break; case 3: for(int j=0;j<10;j++){ for(int i=9;i>=0;i--)printf("%c",mp[i][j]); printf("\n"); } break; } } }