[Daily Blue Bridge] 8. 제 13 회 도립 게임 자바 그룹 '크로스 차트 인쇄'의 진짜 문제

안녕하세요, 저는 버그를 작성할 수있는 프로그래머, 작은 회색 원숭이입니다!

" Daily Blue Bridge " 칼럼에 관심을 가져 주신 모든 분들을 환영합니다 .이 칼럼의 주요 기능은 최근 몇 년간 Blue Bridge Cup 지방 대회와 결승전의 실제 질문을 공유하고 알고리즘 아이디어, 데이터 구조 및 기타를 분석하는 것입니다. 그 안에 존재하는 콘텐츠, 더 많은 지식과 기술을 배우는 데 도움이됩니다!

제목 : 크로스 차트 인쇄

Xiao Ming은 아래와 같이 조직 (적십자 아님)을 위해 십자 모양의 로고를 디자인했습니다.

상대방도 컴퓨터 dos 창에 문자 형태로 로고를 출력해야하며 임의로 레이어 수를 제어 할 수 있습니다.

공백 수를 정확하게 비교하기 위해 프로그램은 행의 공백을 대체 할 마침표 (.)가 필요합니다.

 

입력 형식 : 양의 정수 n (n <30)은 인쇄 할 그래픽 레이어 수를 나타냅니다.

산출:

주변 레이어의 수에 해당하는 기호

예 : 사용자 입력 :

1

프로그램은 다음을 출력해야합니다.

 

또 다른 예 : 사용자 입력

프로그램은 다음을 출력해야합니다.

 

주기 수와 출력 위치에 특히주의하면서 샘플을주의 깊게 관찰하십시오.

리소스 계약 :
최대 메모리 소비량 <64M

CPU 소비량 <1000ms

요구 사항에 따라 엄격하게 출력하고 "Please enter ..."와 유사한 불필요한 내용을 인쇄하지 마십시오.

모든 코드는 동일한 소스 파일에 저장되며 테스트 통과 후 소스 코드를 복사하여 제출합니다.

참고 : 주 함수는 0을 반환해야합니다.

참고 : ANSI C / ANSI C ++ 표준 만 사용하고 컴파일 환경이나 운영 체제에 의존하는 특수 함수를 호출하지 마십시오.

참고 : 모든 종속 함수는 소스 파일에 명확하게 있어야합니다. #include <xxx>는 공통 헤더 파일을 무시하도록 프로젝트를 통해 설정할 수 없습니다.

제출할 때 원하는 컴파일러 유형을 선택하는 데주의하십시오.

문제 해결 아이디어 :

이 질문의 초점은 각 그래픽 레이어의 특성을주의 깊게 관찰 한 다음 각 라인의 법칙을 추론하는 것입니다.

이 질문의 아이디어는 먼저 각 줄을 인쇄하는 규칙을 찾은 다음 각 그래픽 레이어를 개별적으로 인쇄 한 다음 2 차원 배열을 사용하여 각 레이어의 "$"기호 위치를 2 차원으로 기록합니다. 마지막 2 차원 배열은 전체 그래프의 데이터를 저장 한 다음 2 차원 배열을 출력 할 수 있습니다.

답변 소스 코드 :

package 一三年省赛真题;

import java.util.Scanner;

public class Year2013_t8 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int m = scanner.nextInt();
		drawAll(m);
	}
	
	/**
	 * 绘制整个图形
	 * @param m 图形共有多少层
	 * */
	public static void drawAll(int m) {
		int row = 5+4*m;
		int list = 5+4*m;
		String[][] drawArr = new String[row][list];		//建立存放该图形的二维数组
		for (int i = 0; i <= m; i++) {
			drawN(m, i, drawArr);
		}
		
		//将图形输出
		for (int i = 0; i < drawArr.length; i++) {
			for (int j = 0; j < drawArr.length; j++) {
				if (drawArr[i][j]!="$") {
					drawArr[i][j] = ".";
				}
				System.out.print(drawArr[i][j]);
			}
			System.out.println();
		}
	}
	
	
	/**
	 * 画第n层图形
	 * @param m 图形的总层数
	 * @param n 当前绘制的层数
	 * @param drawArr 存放图形的二维数组
	 * */
	public static void drawN(int m,int n,String[][] drawArr) {
		
		int r = 2*(m-n);		//确定该层图形的起始横纵坐标
		int width = 5 + 4*n;	//获取该层图形的最大宽度
		int height = 5 + 4*n;			//获取该层图形的最大高度
		
		//绘制第一行和倒数第一行
		for (int i = 2; i < height-2; i++) {
			drawArr[r+0][r+i] = "$";
			drawArr[r+height-1][r+i] = "$";
		}
		
		//绘制第二行和倒数第二行
		drawArr[r+1][r+2] = "$";
		drawArr[r+1][r+width-3] = "$";
		drawArr[r+height-2][r+2] = "$";
		drawArr[r+height-2][r+width-3] = "$";
		
		//绘制第三行和倒数第三行
		for (int i = 0; i < 3; i++) {
			drawArr[r+2][r+i] = "$";
			drawArr[r+2][r+width-1-i] = "$";
			drawArr[r+height-3][r+i] = "$";
			drawArr[r+height-3][r+width-1-i] = "$";
		}
		
		//绘制第四到倒数第四行
		for (int i = 3; i < height-3; i++) {
			drawArr[r+i][r+0] = "$";
			drawArr[r+i][r+width-1] = "$";
		}
		
	}
	
}

 

샘플 출력 :

부족하거나 개선 된 부분이 있으며 친구들이 메시지를 남기고 함께 배우기를 바랍니다!

관심있는 친구들은 칼럼을 따라갈 수 있습니다!

Little Grey Ape가 함께 진행하여 함께 진행합니다!

마지막으로 2020 년 블로그 스타 선정에 참여하고 있으니 투표를 도와주세요!

투표 링크 : https://bss.csdn.net/m/topic/blog_star2020/detail?username=weixin_44985880

추천

출처blog.csdn.net/weixin_44985880/article/details/112757277