1287 孙武练兵
1287 孙武练兵
题目描述
春秋时代有个伟大的军事家名叫孙武,有一天去见吴王阖闾,吴王问他能不能训练女兵,
孙武说:“可以。”于是吴王便拨了一百多位宫女给他。孙武把宫女编成队伍,
用吴王最宠爱的妃子为队长,然后把一些军事的基本动作教给她们,并告诫她们还要遵守军令,
不可违背。不料孙武开始发令时,宫女们觉得好玩,都一个个笑了起来,...,孙武生气了,便下令把
队长拖去斩首,理由是队长领导无方。
之后,宫女终于听话了,虽然队伍还是不怎么整齐,但是对于孙武的号令,是不敢违背了。
队伍在m*n(0<=20)的练兵场上,0表示空地,1表示宫女,每次操练,孙武有t(t小于10)次号令。 孙武共有8种号令,编号1~8,分别表示队伍向↑、↓、←、→、↖,↙,↗,↘方向移动。
每一次的号令包括两个数字x(1<=x<=8)和y,分别表示号令的编号和该次号令要移动的距离。
宫女毕竟是宫女,还是比较难伺候的,如果移动后的坐标↑、↓、←、→有一个方位偏离最初始位置大于5,
那么宫女就会不听话,发出抗议"X Error"(X为up、down、left、right、up-left,down-left,up-right,down-right之一),
并留在原地。
输入要求
第1行两个整数m、n
第2行一个整数t
接下来t行,每行包括2个整数x和y。
字母的意义如Description中描述。
输出要求
如果有抗议现输出抗议,单独一行。
输出每一次号令后的m*n练兵场范围内的队伍方阵。
两次号令间空一行
测试数据
//输入
5 5
0 0 0 0 0
0 1 1 1 0
0 1 1 1 0
0 1 1 1 0
0 0 0 0 0
3
1 2
1 5
8 3
//输出
01110
01110
00000
00000
00000
up Error
01110
01110
00000
00000
00000
00000
00000
00001
00001
00001
AC代码
主要为了记录,原谅我懒的写函数,看代码可能会有点累,开大数组的目的是为了省的考虑边界问题
#include <bits/stdc++.h>
using namespace std;
int main() {
int res[40][40],in[40][40],n,m,x,y,sumx=0,sumy=0,t,tsumx=0,tsumy=0,cnt=0;
string s[9]= {"up","down","left","right","up-left","down-left","up-right","down-right"};
memset(res,0,sizeof(res));
memset(in,0,sizeof(in));
cin>>m>>n;
for(int i=6; i<m+6; i++) {
for(int j=6; j<n+6; j++) cin>>in[i][j];
}
cin>>t;
while(t--) {
if(cnt!=0) cout<<endl;
cnt++;
cin>>x>>y;
tsumx=sumx;
tsumy=sumy;
if(x==1) tsumx-=y;
else if(x==2) tsumx+=y;
else if(x==3) tsumy-=y;
else if(x==4) tsumy+=y;
else if(x==5) tsumx-=y,tsumy-=y;
else if(x==6) tsumx+=y,tsumy-=y;
else if(x==7) tsumx-=y,tsumy+=y;
else if(x==8) tsumx+=y,tsumy+=y;
if(abs(tsumx)>5 || abs(tsumy)>5) {
cout<<s[x-1]<<" Error"<<endl;
for(int i=6; i<m+6; i++) {
for(int j=6; j<n+6; j++) cout<<res[i][j];
cout<<endl;
}
} else {
sumx=tsumx;
sumy=tsumy;
for(int i=6; i<m+6; i++) {
for(int j=6; j<n+6; j++) res[i][j]=in[i-sumx][j-sumy],cout<<res[i][j];
cout<<endl;
}
}
}
return 0;
}