题解 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;
}