【题解】洛谷 P6368 [COCI2006-2007#6] MAGIJA

题目大意

给出一个\(r\times m\)的由“#”和“.“组成的矩阵,要求将此矩阵以右边界和下边界为对称轴对称和以右下角为对对称点中心对称后得到的(\(2r\times 2m\))新矩阵。并将指定的\((x,y)\)位置上的字符进行变换。

分析

看完题目:模拟大法好哇!

但是感觉开三个for好麻烦……

我们先对几个点的变换进行分析:
\((1,1)\to(1,4),(4,1),(4,4)\)\((2,2)\to(2,3),(3,2),(3,3)\)……

由此我们可以发现:
\((x,y)\to(x,2\times m-y+1),(2\times n-x+1,y),(2\times n-x+1,2\times m-y+1)\)

结论有了,标程还会远吗?

Code

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
char a[201][201];
int dx[3]={0,1,1},dy[3]={1,0,1};
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	scanf("%d%d",&x,&y);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			for(int k=0;k<3;k++){
				int xx=dx[k]?(2*n-i+1):i,yy=dy[k]?(2*m-j+1):j;
				a[xx][yy]=a[i][j];
			}
	if(a[x][y]=='#') a[x][y]='.';
	else a[x][y]='#';
	for(int i=1;i<=n*2;i++){
		for(int j=1;j<=m*2;j++)
			cout<<a[i][j];
		cout<<endl;
	}
	return 0;
 } 

完结撒fa~

posted @ 2020-10-26 08:16  SingularPoint  阅读(102)  评论(1编辑  收藏  举报