วันพุธที่ 2 กันยายน พ.ศ. 2558

ฝึกการเเก้โจทย์ด้วย Python โจทย์ " Brick "

โจทย์ " 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|.|
          |.|.|.|.|.|
          |#|.|.|.|.|
          ===========
          

ไม่มีความคิดเห็น:

แสดงความคิดเห็น