โจทย์ " Brick "
ในตารางเกมขนาด N แถว M คอลัมน์ โดยในตารางมีสิ่งกีดขวางวางเอาไว้ ด้านบนมีก้อนอิฐหลายๆ ก้อนที่กำลังจะหล่นลงมา ตัวอย่างของเกมดูได้ในตัวอย่างข้อมูลนำเข้า เป็นตารางขนาด (N=8)x(M=5) ซึ่งสถานะเริ่มต้นของตารางเกมแสดงในตัวอย่างข้อมูลน้ำเข้า และเมื่อเกมได้ประมวลผลแล้ว ซึ่งก็คืออิฐตกจากด้านบนลงสู่ด้านล่าง จะเห็นว่าอิฐจะมีการตกค้างที่สิ่งกีดขวาง และผลลัพธ์หลังจากประมวลเสร็จสิ้นดังแสดงในตัวอย่างข้อมูลส่งออก
จงเขียนโปรแกรมเพื่อรับตารางเกมเริ่มต้นและจำนวนอิฐที่จะตกลงมาในแต่ละคอลัมน์ ให้ประมวลผลก้อนอิฐทุกก้อน โดยมีเงื่อนไขดังนี้
(1) ถ้าก้อนอิฐตกลงมาแล้วพบสิ่งกีดขวางที่อยู่ในตารางเกม ก็จะค้างอยู่ ณ ตำแหน่งที่พบสิ่งกีดขวาง
(2) ถ้าก้อนอิฐไม่พบสิ่งกีดขวางจะตกลงมาอยู่แถวล่างสุด เมื่อประมวลผลครบทุกก้อนอิฐให้แสดงผลสถานะของตารางเกม
ข้อมูลนำเข้า
บรรทัดแรก จะระบุจำนวนเต็มสองจำนวน N และ M โดยที่ 1 < N < 20 และ 1 < M < 20
N บรรทัดถัดไป จะเป็นการระบุตารางเกม โดยในบรรทัดที่ 1 + I จะเป็นข้อมูลของตารางเกมแถวที่ I ซึ่งจะระบุเป็นสายอักขระความยาว M ตัวอักขระ ที่มีรูปแบบดังนี้ (1) เครื่องหมายจุด ‘.’ แทนช่องที่ว่างในตารางเกม และ (2) ตัวอักษร ‘O’ ((ตัวพิมพ์ใหญ่โอ) แทนช่องที่มีสิ่งกีดขวางอยู่
บรรทัดสุดท้าย ประกอบด้วยตัวเลข M ตัวคือ M1,M2,M3,… แต่ละตัวคั่นด้วยช่องว่างหนึ่งช่อง ตัวเลข คือจำนวนก้อนอิฐที่จะตกลงมาในคอลัมน์ที่ j โดยที่ 0≤aj≤20
ข้อมูลส่งออก
ให้เขียนผลลัพธ์ออกทางแฟ้ม โดยให้ระบุตารางเกมผลลัพธ์ในรูปแบบเดียวกับในแฟ้มข้อมูลนำเข้า ให้ใช้เครื่องหมาย ‘#’ แทนก้อนอิฐอยู่ในตาราง
ที่มา: การแข่งขันคอมพิวเตอร์โอลิมปิก สอวน. ครั้งที่ 1 มหาวิทยาลัยเกษตรศาสตร์
ตัวอย่างข้อมูลนำเข้า ตัวอย่างข้อมูลส่งออก
8 5 ..#..
..... .##..
..... .OO..
.OO.. ...#.
..... .O.#.
.O... ...O.
...O. .....
..... #....
.....
1 1 3 2 0
ความช่วยเหลือ: ไม่มีคำใบ้สำหรับปัญหานี้
ที่มาของโจทย์: www.programming.in.th
วิเคราะห์โจทย์
- รับค่าข้อมูลจำนวน 3 ค่า คือค่า จำนวนของเเถว เเละ จำนวนของคอลัมน์ 1 ค่า เเละข้อมูลของสิ่งกีดขวางในตัวเกม อีกจำนวน N ค่า เเละค่าสุดท้ายคือค่าของ ก้อนอิฐ ที่จะใส่ลงไปในเเต่ล่ะช่อง
- ทำการตรวจสอบการตกของ ก้อนอิฐ ว่าเป็นอย่างไรเเละอยู่ที่ตำเเหน่งไหนของเกมส์
เเนวคิดในการเเก้โจทย์
- ทำการรับค่า Input จำนวนเเถว เเละ คอลัมน์มาสร้างเป็น อาเรย์ 2D เเล้วทำการใช้ Loop เพื่อวนใส่ค่าของสิ่งกีดขวาง ในอาเรย์ 2D จากนั้นทำการตรวจสอบตามเเนวตั้งว่ามีสิ่งกีดขวางหรือไม่ถ้ามีให้ใส่ก้อนอิฐ ด้านบนจนครบจำนวนของค่า Input ของก้อนอิฐ เเล้วทำอย่างนี้จนครบทุกเเถว ในกรณีที่ไม่มีสิ่งกีดขวางก็ให้ใส่ก้อน อิฐ ไปเลย
Code Python
def Play_game(Input_map,user_item):
save_index = 0
save_item = 0
for l in range(len(Input_map[0:][0])):
save_item = int(user_item[l])
for i in range(len(Input_map[0:][0:])):
save_index = i
if len(Input_map[0:][0:]) == 1:
if save_item > 0 and Input_map[i][l] != "O" :
Input_map[save_index][l] = "#"
elif Input_map[i][l] == "O":
while True:
if save_item == 0 or save_index < 1:
break
Input_map[save_index-1][l] = "#"
save_item = save_item-1
save_index = save_index-1
break
elif i == len(Input_map[0:][0:])-1:
while True:
if save_item == 0 or save_index < 1:
break
Input_map[save_index][l] = "#"
save_item = save_item-1
save_index = save_index-1
break
return Input_map
def Display_map_update(Input_map,map_str):
output_map = []
Index_str = 0
for l in range(len(Input_map[0:][0:])):
output_map.append([])
for i in range(len(Input_map[0:][0])):
output_map[l].append(map_str[Index_str])
Index_str+=1
return output_map
def Display_map(Input_map):
print("=="*len(Input_map[0:][0])+"=")
Save_str = "|"
for l in range(len(Input_map[0:][0:])):
for i in range(len(Input_map[0:][0])):
Save_str = Save_str + str(Input_map[l][i])+"|"
print(Save_str)
Save_str = "|"
print("=="*len(Input_map[0:][0])+"=")
def Check_input_map(Input_column):
for i in range(len(Input_column)):
if Input_column[i] != '.' and Input_column[i] != 'O':
print("Input you not . or o check input your new")
return False
return True
def Check_player_game(column_input):
while True:
user_to_map = str(input("Input your play game is : "))
if user_to_map.count(" ")+1 == column_input:
break
else:
print("Input player column is "+str(column_input) )
return user_to_map
Input_row,Input_column = input("Input rows and columns you is : ").split(" ")
map_game = [["_"]*int(Input_column)]*int(Input_row)
Display_map(map_game)
Save_map = ""
for i in range(1,int(Input_row)+1):
while True:
Input_column_str = str(input("Input rows "+str(i)+" is : "))
Input_column_str = Input_column_str.upper()
if len(Input_column_str) == int(Input_column) and Check_input_map(Input_column_str):
Save_map = Save_map+Input_column_str
break
elif len(Input_column_str) != int(Input_column):
print("Input you not support enter data again")
map_game = Display_map_update(map_game,Save_map)
Display_map(map_game)
Input_user = Check_player_game(int(Input_column))
Input_user = Input_user.split(" ")
map_game = Play_game(map_game,Input_user)
Display_map(map_game)
ผลลัพธ์ที่ได้...
Input rows and columns you is : 8 5
===========
|_|_|_|_|_|
|_|_|_|_|_|
|_|_|_|_|_|
|_|_|_|_|_|
|_|_|_|_|_|
|_|_|_|_|_|
|_|_|_|_|_|
|_|_|_|_|_|
===========
Input rows 1 is : .....
Input rows 2 is : .....
Input rows 3 is : .oo..
Input rows 4 is : .....
Input rows 5 is : .o...
Input rows 6 is : ...o.
Input rows 7 is : .....
Input rows 8 is : .....
===========
|.|.|.|.|.|
|.|.|.|.|.|
|.|O|O|.|.|
|.|.|.|.|.|
|.|O|.|.|.|
|.|.|.|O|.|
|.|.|.|.|.|
|.|.|.|.|.|
===========
Input your play game is : 1 1 3 2 0
===========
|.|.|#|.|.|
|.|#|#|.|.|
|.|O|O|.|.|
|.|.|.|#|.|
|.|O|.|#|.|
|.|.|.|O|.|
|.|.|.|.|.|
|#|.|.|.|.|
===========
ไม่มีความคิดเห็น:
แสดงความคิดเห็น