LuoguP1538 迎春舞会之数字舞蹈 题解

P1098一样是个大模拟题。

这样的数字其实在生活中很常见,比如说你家里的机顶盒的显示屏等等。


先看\(k=1\)的时候各个数字的显示。

     -   -       -   -   -   -   -   -
  |   |   | | | |   |     | | | | | | |
     -   -   -   -   -       -   -
  | |     |   |   | | |   | | |   | | |
     -   -       -   -       -   -   -

我们发现,其实每个数字都可以分成\(5\)部分:


     -   -       -   -   -   -   -   -	第一部分
---------------------------------------
  |   |   | | | |   |     | | | | | | |	第二部分
---------------------------------------  
     -   -   -   -   -       -   -      第三部分
--------------------------------------- 
  | |     |   |   | | |   | | |   | | | 第四部分
---------------------------------------
     -   -       -   -       -   -   -	第五部分

而且我们还发现,奇数部分只有"-",偶数部分只有"|",并且每个之间都有一定的规律。

所以我们先找找规律吧。


第一部分:只有\(2,3,5,6,7,8,9,0\)有"-",其他的都没有。

第二部分:第一类(只有左边有"|"):\(5,6\);第二类(只有右边有"|"):\(1,2,3,7\);第三类(两边都有"|"):\(4,8,9,0\)

第三部分:只有\(2,3,4,5,6,8,9\)有"-",其他的都没有。

第四部分:第一类(只有左边有"|"):\(2\);第二类(只有右边有"|"):\(1,3,4,5,7,9\);第三类(两边都有"|"):\(6,8,9\)

第五部分:只有\(2,3,5,6,8,9,0\)有"-",其他的都没有。

所以,按照这样分类讨论就行了。


代码实现的时候可以一行一行的讨论,然后分别判断每个数字,最后依次输出就行了。实在不懂的可以看我\(100\)多行的代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;

int k;
char s[260];

int main() {
	scanf("%d%s", &k, s);
	for(int i = 1; i <= 2 * k + 3; ++i) {
		if(i == 1) {
			for(int j = 0; j < strlen(s); ++j)
				if(s[j] == '0' || s[j] == '2' || s[j] == '3' || s[j] == '5' || s[j] == '6' || s[j] == '7' || s[j] == '8' || s[j] == '9') {
					for(int ii = 1; ii <= k + 3; ++ii)
						if(ii != 1 && ii != k + 3 && ii != k + 2)
							printf("-");
						else
							printf(" ");
				} else {
					for(int ii = 1; ii <= k + 3; ++ii)
						printf(" ");
				} 
		}
		else if(i >= 2 && i <= k + 1) {
			for(int j = 0; j < strlen(s); ++j)
				if(s[j] == '0' || s[j] == '4' || s[j] == '8' || s[j] == '9') {
					for(int ii = 1; ii <= k + 3; ++ii)
						if(ii == 1 || ii == k + 2)
							printf("|");
						else
							printf(" ");
				} else if(s[j] == '1' || s[j] == '2' || s[j] == '3' || s[j] == '7') {
					for(int ii = 1; ii <= k + 3; ++ii)
						if(ii == k + 2)
							printf("|");
						else
							printf(" ");
				} else if(s[j] == '5' || s[j] == '6') {
					for(int ii = 1; ii <= k + 3; ++ii)
						if(ii == 1)
							printf("|");
						else
							printf(" ");
				}
		} else if(i == k + 2) {
			for(int j = 0; j < strlen(s); ++j) {
				if(s[j] == '2' || s[j] == '3' || s[j] == '4' || s[j] == '5' || s[j] == '6' || s[j] == '8' || s[j] == '9') {
					for(int ii = 1; ii <= k + 3; ++ii)
						if(ii != 1 && ii != k + 2 && ii != k + 3)
							printf("-");
						else
							printf(" ");
				}
				else
					for(int ii = 1; ii <= k + 3; ++ii)
						printf(" ");
			}
		} else if(i >= k + 3 && i <= 2 * k + 2) {
			for(int j = 0; j < strlen(s); ++j) {
				if(s[j] == '1' || s[j] == '3' || s[j] == '4' || s[j] == '5' || s[j] == '7' || s[j] == '9') {
					for(int ii = 1; ii <= k + 3; ++ii) {
						if(ii == k + 2)
							printf("|");
						else
							printf(" ");  
					}
				} else if(s[j] == '2') {
					for(int ii = 1; ii <= k + 3; ++ii) {
						if(ii == 1)
							printf("|");
						else
							printf(" ");
					}
				} else if(s[j] == '0' || s[j] == '6' || s[j] == '8') {
					for(int ii = 1; ii <= k + 3; ++ii) {
						if(ii == 1 || ii == k + 2)
							printf("|");
						else
							printf(" ");
					}
				}
			} 
		} else {
			for(int j = 0; j < strlen(s); ++j)
				if(s[j] == '0' || s[j] == '2' || s[j] == '3' || s[j] == '5' || s[j] == '6' || s[j] == '8' || s[j] == '9') {
					for(int ii = 1; ii <= k + 3; ++ii) {
						if(ii != 1 && ii != k + 2 && ii != k + 3)
							printf("-");
						else
							printf(" ");
					}
				} else {
					for(int ii = 1; ii <= k + 3; ++ii)
						printf(" ");
				}
		}
		puts("");
	}
	return 0;
}
//防伪水印:UID=112917

蒟蒻实在不懂各位神仙的神仙写法,就只好写个暴力造福新人了。

不在右上方点个赞再走嘛?

posted @ 2021-12-23 21:05  Eason_AC  阅读(38)  评论(0)    收藏  举报