안녕하세요, 저는 버그를 작성할 수있는 프로그래머, 작은 회색 원숭이입니다!
" Daily Blue Bridge " 칼럼에 관심을 가져 주신 모든 분들을 환영합니다 .이 칼럼의 주요 기능은 최근 몇 년간 Blue Bridge Cup 지방 대회와 결승전의 실제 질문을 공유하고 알고리즘 아이디어, 데이터 구조 및 기타를 분석하는 것입니다. 그 안에 존재하는 콘텐츠, 더 많은 지식과 기술을 배우는 데 도움이됩니다!
제목 : 크로스 차트 인쇄
Xiao Ming은 아래와 같이 조직 (적십자 아님)을 위해 십자 모양의 로고를 디자인했습니다.
상대방도 컴퓨터 dos 창에 문자 형태로 로고를 출력해야하며 임의로 레이어 수를 제어 할 수 있습니다.
공백 수를 정확하게 비교하기 위해 프로그램은 행의 공백을 대체 할 마침표 (.)가 필요합니다.
입력 형식 : 양의 정수 n (n <30)은 인쇄 할 그래픽 레이어 수를 나타냅니다.
산출:
주변 레이어의 수에 해당하는 기호
예 : 사용자 입력 :
1
프로그램은 다음을 출력해야합니다.
또 다른 예 : 사용자 입력
삼
프로그램은 다음을 출력해야합니다.
주기 수와 출력 위치에 특히주의하면서 샘플을주의 깊게 관찰하십시오.
리소스 계약 :
최대 메모리 소비량 <64MCPU 소비량 <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] = "$"; } } }
샘플 출력 :