自学内容网 自学内容网

洛谷 P6368 [COCI2006-2007#6] MAGIJA C语言

题目:
https://www.luogu.com.cn/problem/P6368

题目背景

知名魔术师 Al'Dimi Kartimi 需要你帮助他来设计他扑克牌的背面图案。

题目描述

众所周知,扑克牌的背面是一个矩形,通过做两边的中垂线可以将矩形分成相等的四部分。

Al'Dimi Kartimi 首先绘制了左上角部分的图案,图案共有 r 行 m 列,由字符 # 和字符 . 组成。绘制完后,他将该图案沿矩形垂直方向的中垂线镜面对称地绘制了矩形右上角的部分。然后他沿矩形水平方向的中垂线镜面对称地绘制了矩形的下半部分。

在绘制后,Al'Dimi Kartimi 会故意犯一个小错误,以此来帮助他识别这是哪张扑克牌的背面。具体的,他会选择第 x 行第 y 列的字符,若该字符是 #,则将其改成 .,否则将其改成 #

输入格式

第一行有两个整数,分别表示左上角图案的行数 rr 和列数 cc。

第 2 到第 (r+1) 行,每行一个长度为 c 的字符串,第 (i+1) 行的第 j 个字符 si,j​ 表示图案第 i 行第 j 列的字符。

第 (r+2) 行有两个整数,分别表示小错误所在的行数 x 和列数 y。

输出格式

输出 2r 行,每行一个长度为 2c 的字符串,表示整个背面的图案。

思路:题目下标就是索引从1开始的,我使用的是string类型的数组储存字符串,行的下标是从1开始的,列却是0为索引开始的。中垂线对称以及x轴对称都可以用行处理,当改变字符的时候,因为列是0为索引,所以列的下标y-1。

代码如下:

#include<iostream>
#include<string>
#include<algorithm> 
using namespace std;
int r,c;//行和列
int x,y;
string line[200];
char transdot(char ch)
{
if(ch == '#')return '.';
if(ch == '.')return '#';
return '?';
}

string trans(string s)
{
string sl = s;
reverse(s.begin(),s.end());
sl = sl + s;
return sl;
 } 
int main(void)
{
cin >> r >> c;
for(int i = 1 ; i <= r ; i++)
{
cin >> line[i];
}
cin >> x >> y;
//中垂线(y)对称
for(int i = 1 ; i <= r ; i++)
{
line[i] = trans(line[i]);
} 

//(x)轴对称赋值
int i = 2*r;
int j = 1;
while(i >= j)//对称赋值 
{
line[i] = line[j];
i--;
j++;
}

//取出第x行改变第y列的点

    line[x][y-1] = transdot(line[x][y-1]) ; 

for(int k = 1 ; k <= 2*r ; k++)
cout << line[k] << endl;
 

return 0;
 } 


原文地址:https://blog.csdn.net/zqystca/article/details/144327883

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!