有趣的路燈問題——按規律列印圖形

jsyuger發表於2020-10-09

路燈問題

人的天職在勇於探索真理。  ——哥白尼(波蘭)

國慶長假期間,看到一條路上的路燈非常有趣,有紅黃藍三種顏色,依次排成一條線狀。不禁聯想到有個廠子的筆試題裡面也有類似的場景,描述是這樣子的,一條長長的公路上,分別掛有紅黃藍三種顏色的裝飾燈,排列規則如圖所示:(這裡用三角形代表紅燈,用正方形代表黃燈,用圓形代表藍燈)

假設公路無限長,燈按照以上這種規律排列下去,要求程式計算每輸入一個整數n,就能輸出第n個位置的路燈顏色(圖案)。這樣的場景下,如果用數學的方法來解決,肯定要涉及到數列的求和,計算起來還是比較費勁的,用計算機幫我們實現計算,那就相當的快了。

隨手寫了個程式,跑了一下,能行:

package math;

import org.junit.Test;

/**
 * 該類為按規律輸出圖形的實現
 * @author jsyuger
 * 有以下規律圖形:
 * △ □ ○ △ △ □ □ ○ ○ △ △ △ □ □ □ ○ ○ ○ ......
 * 輸出第n個圖形的圖案
 */
public class PrintRegular {
	/**
	 * 輸入第n個位置,返回第n個位置的圖案
	 * @param n
	 * @return 
	 */
	public String printRegular(int n) {
		int m = 0 ; /** 用於圖形的總計數 **/
		String type = "△" ; /** 初始化返回的圖案型別 **/
		
		for(int i=1 ; i<=n && m<=n ; i++) {
			for(int a=1;a<=i;a++) { //用於迴圈列印三角形
				//System.out.print("△"); //用於測試
				m++; //每列印一個三角形計數器加1
				if(m==n) { //當達到第n個的時候,返回圖案型別,跳出迴圈
					type = "△";
					break;
				}	
			}
			for(int b=1;b<=i;b++) {
				//System.out.print("□"); //用於測試
				m++;
				if(m==n) {
					type = "□";
					break;
				}
			}
			for(int c=1;c<=i;c++) {
				//System.out.print("○"); //用於測試
				m++;
				if(m==n) {
					type = "○";
					break;
				}
			}
		}
		
		return type ;
	}

	@Test
	/**
	 * 測試方法:輸出前18個圖案
	 */
	public void test() {
		for(int i=1;i<=18;i++)
			System.out.print(printRegular(i));
	}
}

控制檯輸出結果:

△□○△△□□○○△△△□□□○○○


以上路燈問題是簡單一維控制位置,即路燈只有形狀(或顏色)這一單一變數的控制。擴充一下,假設該公路上的燈是按照下面的方式進行排列的,即按照三角形、正方形、圓形順序,顏色則按照紅黃藍綠的順序來排列:

此時,路燈則有兩個變數來控制,即顏色和形狀。要求程式輸出第n個位置的圖案以及顏色

隨手改了下上面的程式,跑了一下,也能行:

package math;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

/**
 * 該類為按規律輸出圖形的實現
 * @author jsyuger
 * 有以下規律圖形:
 * △ □ ○ △ △ □ □ ○ ○ △ △ △ □ □ □ ○ ○ ○ ......
 * 輸出第n個圖形的圖案
 */
public class PrintRegular {
	/**
	 * 輸入第n個位置,返回第n個位置的圖案和顏色
	 * @param n
	 * @return 
	 */
	public Map<String,String> printRegular(int n) {
		Map<String,String> hashMap =new HashMap<String,String>(); //用於存放結果(形狀->顏色)
		int m = 0 ; /** 用於圖形的總計數 **/
		String type = "△" ; /** 初始化返回的圖案型別 **/
		String color = "red"; /** 初始化返回的圖案顏色 **/
		
		for(int i=1 ; i<=n && m<=n ; i++) {
			for(int a=1;a<=i;a++) { //用於迴圈列印三角形
				m++; //每列印一個三角形計數器加1
				if(m==n) { //當達到第n個的時候,返回圖案型別,跳出迴圈
					type = "△";
					break;
				}	
			}
			for(int b=1;b<=i;b++) {
				m++;
				if(m==n) {
					type = "□";
					break;
				}
			}
			for(int c=1;c<=i;c++) {
				m++;
				if(m==n) {
					type = "○";
					break;
				}
			}
		}
		
		//獲取顏色
		int x = n%4 ;
		switch(x) {
			case(0) : 
				color = "green" ;
				break;
			case(1) : 
				color = "red";
				break;
			case(2) : 
				color = "yellow";
				break;
			case(3) : 
				color = "blue";
				break;
		}
		//封裝結果
		hashMap.put(type, color);
		return hashMap ;
	}

	@Test
	/**
	 * 測試方法:輸出第9個圖案以及顏色
	 */
	public void test() {
		System.out.print(printRegular(9));
	}
}

控制檯輸出:

{○=red}


讀者朋友們可嘗試對路燈的變數新增多維控制,在計算機裡面,每個維度都可以單獨計算求值,除非是兩個關聯影響的變數。路燈問題實際上,是按照規律列印圖案的基礎問題的現實場景,按照一定的規律輸出圖案,可自行嘗試編碼實現。

 

 

 

相關文章