题解 P1538 【迎春舞会之数字舞蹈】
1.用0,1,2这三个数分别表示空格,-,|然后找规律,而规律就是行=2n+3,列=n+2。(n=k)
2.观察可发现每行的空格,-,|所出现的位置都和我们所输入的串里的数有关,例如:首行1和4是没有"--"的,而其它数都是有"--"的,第二行1和2和3和7都是在最右列有"|"而在最右列前都是空格,5和6都是在最左列有"|"而最左列后都是空格,4和8和9和0都是最左列和最右列有"|"而最左列至最右列的中间部分则是空格,同理,后面所剩的行都有与这两行类似的规律。PS:第2部分的例子来自输出样例呢
3.上述规律全部找到后就可以撸代码了呢,当然第2部分的规律可以一边写一边看(因为超级容易发现的)。
最后我要骂我自己一次,你真是个傻逼傻逼傻逼,傻逼到用循环去读数字。
#include <stdio.h>
#include <string.h>
void f1(int n,int *p){
int i;
for(i = 1; i <= n+2; i++,(*p)++){
printf(" ");
}
printf(" ");
}
void f2(int n,int *p){
int i;
for(i = 1; i <= n+2; i++,(*p)++){
if(i == 1 || i == n+2){
printf(" ");
}
else{
printf("-");
}
}
printf(" ");
}
void f3(int n,int *p){
int i;
for(i = 1; i <= n+2; i++,(*p)++){
if(i == n+2){
printf("|");
}
else{
printf(" ");
}
}
printf(" ");
}
void f4(int n,int *p){
int i;
for(i = 1; i <= n+2; i++,(*p)++){
if(i == 1){
printf("|");
}
else{
printf(" ");
}
}
printf(" ");
}
void f5(int n,int *p){
int i;
for(i = 1; i <= n+2; i++,(*p)++){
if(i == 1 || i == n+2){
printf("|");
}
else{
printf(" ");
}
}
printf(" ");
}
int main(){
char s[260];
int i,j,n,index = 0,length = 0;
scanf("%d %s", &n,s);
length = strlen(s);
for(i = 1; i <= 2*n+3; i++){ //行
index %= length; //做循环,因为一次循环无法把整个图案给打印出来
for(j = 1; j <= (n+2)*length; j++){ //列
if(i == 1){ //首行
if(s[index] == '1' || s[index] == '4'){
f1(n,&j); //打印图案
j--; //把多的减掉
}
if(s[index] == '2' || s[index] == '3' || s[index] == '5' || s[index] == '6' || s[index] == '7' || s[index] == '8' || s[index] == '9' || s[index] == '0'){
f2(n,&j);
j--;
}
}
if(i >= 2 && i <= (2*n+3)/2){ //首行与中间行所夹着的那些行
if(s[index] == '1' || s[index] == '2' || s[index] == '3' || s[index] == '7'){
f3(n,&j);
j--;
}
if(s[index] == '5' || s[index] == '6'){
f4(n,&j);
j--;
}
if(s[index] == '4' || s[index] == '8' || s[index] == '9' || s[index] == '0'){
f5(n,&j);
j--;
}
}
if(i == (2*n+3)/2+1){ //中间行
if(s[index] == '1' || s[index] == '7' || s[index] == '0'){
f1(n,&j);
j--;
}
if(s[index] == '2' || s[index] == '3' || s[index] == '4' || s[index] == '5' || s[index] == '6' || s[index] == '8' || s[index] == '9'){
f2(n,&j);
j--;
}
}
if(i >= (2*n+3)/2+2 && i <= 2*n+2){ //中间行与末行之间的行
if(s[index] == '1' || s[index] == '3' || s[index] == '4' || s[index] == '5' || s[index] == '7' || s[index] == '9'){
f3(n,&j);
j--;
}
if(s[index] == '2'){
f4(n,&j);
j--;
}
if(s[index] == '6' || s[index] == '8' || s[index] == '0'){
f5(n,&j);
j--;
}
}
if(i == 2*n+3){ //末行
if(s[index] == '1' || s[index] == '4' || s[index] == '7'){
f1(n,&j);
j--;
}
if(s[index] == '2' || s[index] == '3' || s[index] == '5' || s[index] == '6' || s[index] == '8' || s[index] == '9' || s[index] == '0'){
f2(n,&j);
j--;
}
}
index++; //换下个数字
}
printf("\n");
}
return 0;
}