杭电2074
杭电2074
你妈这破题说实话真够恶心的了!!!
此题的思路大致如下:
先判断在最开始输入的两个字符的关系,即谁在中心,谁在边沿,
然后运用两个循环语句判断输出的字符,,并将其保存在2维数组中,因为,通过观察不难发现,
此图是上线对称的,那么你先解决,上盘部分,然后下半部分,输出保存的2维数组,就ok了!!!
具体分析还请看代码!!!
此题要AC注意以下几点!!!
1)每个测试实例建有一个空格!!最后一个例子没有空格!!
2)当n=1时,只能输出中间图案,且没有他的前后没有空格,并且在最后输出换行!!
例如当你输入 1 A B的时候,
你应输出 A(A的前后都没有空格)
(换行)
3)最你好运吧!!!哎!!
#include<iostream>
using namespace std;
int main()
{
int n;char ch1,ch2,ch;
int i,j,k=0,m;
char a[100][100];//定义2维数组用于储存下半部分!!
while(cin>>n>>ch1>>ch2)
{
if(k)
cout<<endl;//判断是否输出空格!!
memset(a,'\0',sizeof(a));//清零
if((n-1)/2%2==1)
{
ch=ch1;
ch1=ch2;
ch2=ch;
}//判断那个是最外成图案
if(n==1)
{cout<<ch1;
cout<<endl;
continue;
}//n=1时点的特殊情况!!
for(i=0;i<=n/2;i++)
{ for(j=0;j<n;j++)
{
if((i==0&&j==0)||(i==0&&j==n-1)||(i==n-1&&j==0)||(i==n-1&&j==n-1))
{
printf(" ");
a[i][j]=' ';//4个角输出空格!
continue;
}
if(j<i&&j%2==0)
{
cout<<ch1;
a[i][j]=ch1;
continue;
}
if(j<i&&j%2==1)
{
cout<<ch2;
a[i][j]=ch2;
continue;
}
if(j>=n-i&&j%2==1)
{
cout<<ch2;
a[i][j]=ch2;
continue;
}
if(j>=n-i&&j%2==0)
{ cout<<ch1;
a[i][j]=ch1;
continue;
}
if(i%2==0)
{ cout<<ch1;
a[i][j]=ch1;
}
if(i%2==1)
{ cout<<ch2;
a[i][j]=ch2;
}//此部分是输出图案的上半部分,请读者自己分析一下!!!
}
cout<<endl;
}
for(i=n/2-1;i>=0;i--)
{ for(j=0;j<n;j++)
cout<<a[i][j];
cout<<endl;}//利用2维数组输出下半部分!!
k++;
}
return 0;
}