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;
}
原文地址:https://www.cnblogs.com/xxhao/p/14318648.html