ROB สลิง: สวัสดี ร็อบฉันและฉันหวังว่าคุณ เกมสำหรับการเล่นเกมจาก 15 ขณะนี้มีสี่ฟังก์ชั่นที่คุณต้องการ ที่จะใช้ในโปรแกรมนี้ - init, วาด, ย้าย, และได้รับรางวัล ดังนั้นให้ดูที่ init ที่นี่เราจะเห็นสิ่งแรกที่เรากำลัง จะทำคือการประกาศตัวแปร ที่เรียกว่าเคาน์เตอร์ มันจะสามารถเริ่มต้น เพื่องครั้งงลบ 1 โปรดจำไว้ว่างเป็นมิติ ของคณะกรรมการของเรา วิธี init จะไปทำงานเป็นมันจะ ย้ำกว่าคณะกรรมการทั้ง และเรากำลังจะเริ่มต้น ที่ด้านบนซ้าย และขอเพียงแค่บอกว่าเรา มี 4 โดย 4 คณะกรรมการ ดังนั้นด้านบนซ้ายเรา จะพูดเป็น 15 แล้วเรากำลังจะนับ ผ่านกระดานบอก 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, และอื่น ๆ ดังนั้นด้านบนซ้ายเราคาดว่าจะเป็นช่วงเวลาที่ดี งลบ 1 ซึ่งใน 4 4 กรณีที่เป็นไปได้ 16 ลบ 1 ซึ่งเป็นที่ถูกต้อง 15 และตอนนี้ที่นี่คือสิ่งที่เรากำลังจะ ย้ำกว่าคณะกรรมการทั้ง และเรากำลังจะตั้งในแต่ละตำแหน่ง คณะกรรมการค่าปัจจุบันของ ที่เคาน์เตอร์ของเราและจากนั้นจะไปที่เคาน์เตอร์ การพร่องเพื่อที่ว่าต่อไป ตำแหน่งที่เราไปถึงเป็นไปได้ นับเป็นหนึ่งในน้อยกว่า ตำแหน่งหน้าที่ ดังนั้นเราจึงเริ่มมี 15 และ พร่องเคาน์เตอร์ ดังนั้นแล้วเราจะกำหนด 14 ตำแหน่งต่อไปลดลงเคาน์เตอร์ และเรากำลังจะได้รับมอบหมาย 13 และอื่น ๆ สุดท้ายเราต้องจัดการกับมุมที่ กรณีที่ถ้าคณะกรรมการที่มีแม้กระทั่ง มิติแล้วก็ทำ 15, 14, 13, 12 ทุกทางลงไปที่ 3, 2, 1, เป็น จะออกจากเราด้วย คณะกรรมการแก้ไม่ได้ และเราต้องสลับที่ 1 และ 2 ดังนั้นถ้างสมัยที่ 2 เท่ากับ 0 ที่ วิธีการที่เรากำลังจะไปตรวจสอบ เพื่อดูว่ามันจะยิ่ง ถ้างสมัยที่ 2 เท่ากับ 0 แล้วในแถวงลบ 1 ซึ่งเป็นแถวด้านล่างและ ตำแหน่งงลบ 2 หรือลบคอลัมน์ง 2 เรากำลังจะตั้งที่ 2, และ คอลัมน์งลบ 3 เรา จะกำหนดเป็น 1 เพื่อให้เป็นเพียงการย้อนกลับที่ 1 และ 2 ขณะนี้ สุดท้ายเรากำลังจะตั้งค่ามาก ล่างขวาเท่ากับว่างที่ ที่ว่างเปล่าได้รับกัญชาที่กำหนดไว้ ที่ด้านบนเป็น 0 ดังนั้นที่ไม่จำเป็นอย่างเคร่งครัด ตั้งแต่นี้สำหรับวงเป็นไปได้ ตั้งด้านล่างขวาเป็น 0 ตั้งแต่ เคาน์เตอร์ตามธรรมชาติจะถึง 0 แต่ที่อาศัยเรารู้ว่า ที่ว่างเปล่าถูก hashed ที่จะหา 0 ถ้าฉันไปลงในโปรแกรมนี้และหลังจากนั้น เปลี่ยนที่ว่างเปล่าที่ด้านบนถึง 100 ก็ ยังควรจะทำงาน ดังนั้นนี่เป็นเพียงการทำให้แน่ใจว่า ล่างขวาเป็นจริงเท่ากับเรา ค่าว่าง สุดท้ายเรามีสองตัวแปรทั่วโลก ดังนั้นฉันและเจว่างเปล่าและที่เราเห็น ผู้ประกาศที่ด้านบน และเรากำลังจะใช้ทั้งสองโลก ตัวแปรในการติดตาม ตำแหน่งของว่างเพื่อที่ว่าเราทำไม่ได้ จำเป็นที่จะต้องมองผ่านทั้งหมด คณะกรรมการจะหาที่ว่างเปล่าทุกเดียว เวลาที่เราพยายามที่จะทำให้การย้าย ดังนั้นตำแหน่งของว่างเสมอคือ จะเริ่มต้นที่ด้านล่างขวา ดังนั้นด้านล่างขวาจะได้รับจาก ดัชนีต้องการลบ 1, D ลบ 1 ดังนั้นที่ init ตอนนี้เราย้ายไปวาด ดังนั้นวาดเป็นไปได้ที่คล้ายกัน ที่เรากำลังจะย้ำ ผ่านคณะกรรมการทั้ง และเราก็ต้องการที่จะพิมพ์ค่า ที่อยู่ในตำแหน่งของคณะกรรมการแต่ละ ดังนั้นที่นี่เรากำลังพิมพ์ค่าที่เป็น ในตำแหน่งของคณะกรรมการแต่ละ และแจ้งให้ทราบว่าเรากำลังทำ - และที่ว่าเพียงแค่บอก printf ที่ โดยไม่คำนึงถึงว่าเป็นหนึ่งหลักหรือ สองตัวเลขเรายังต้องการให้ ใช้เวลาถึงสองคอลัมน์ในการพิมพ์ออก เพื่อที่ว่าถ้าเรามีสองหลักและเป็นหนึ่งใน ตัวเลขหลักในคณะเดียวกันของเรา คณะกรรมการจะยังคงดูดีและสแควร์ ดังนั้นเราจึงต้องการที่จะทำเพื่อค่าทุก ในคณะกรรมการยกเว้นเปล่า ดังนั้นถ้าตำแหน่งในคณะกรรมการเท่ากับ ว่างแล้วเราโดยเฉพาะ ต้องการที่จะพิมพ์ออกมาเพียงแค่ขีด เพื่อเป็นตัวแทนของว่างแทน สิ่งที่ค่าของ ว่างเปล่าจริง สุดท้ายเราต้องการพิมพ์ ออกบรรทัดใหม่ ขอให้สังเกตว่านี้ยังคงเป็นภายใน สำหรับวงด้านนอก แต่ข้างนอก ภายในสำหรับวง ตั้งแต่ด้านนอกนี้สำหรับวงเป็น iterating กว่าแถวทั้งหมดและเพื่อให้ printf นี้ ไปเพียงแค่พิมพ์บรรทัดใหม่ดังนั้นเราจึง ย้ายไปยังพิมพ์ออกมาแถวถัดไป และที่มันวาด ดังนั้นตอนนี้ขอย้ายไปย้าย ตอนนี้เราย้ายผ่านกระเบื้องที่ ผู้ใช้ป้อนในเกม - พวกเขา ป้อนกระเบื้องที่พวกเขาต้องการที่จะย้าย - และ คุณควรจะกลับบูลดังนั้น จริงหรือเท็จขึ้นอยู่กับ ไม่ว่าจะย้ายที่เป็นจริง ถูกต้อง - ไม่ว่าจะเป็นกระเบื้องที่สามารถ ย้ายเข้าไปอยู่ในพื้นที่ว่างเปล่า ดังนั้นที่นี่เราประกาศตัวแปรท้องถิ่น tile_1 และ tile_j ซึ่งจะไป จะคล้ายกับ blank_i และ blank_j, ยกเว้นมันจะติดตาม ตำแหน่งของกระเบื้อง ตอนนี้ที่นี่เรากำลังจะใช้ blank_i และ blank_j และพูดถูกต้องทั้งหมดเพื่อ ที่นี่เป็นที่ว่างเปล่าบนกระดาน ตอนนี้เป็นกระเบื้องที่ว่างเปล่าข้างต้นหรือไม่ เป็นกระเบื้องทางด้านซ้ายของว่างหรือไม่ เป็นกระเบื้องที่ด้านขวาของว่างหรือไม่ เป็นกระเบื้องด้านล่างที่ว่างเปล่าหรือไม่ ดังนั้นถ้ากระเบื้องที่อยู่ในใด ๆ ของผู้ ตำแหน่งแล้วเรารู้ว่ากระเบื้อง สามารถย้ายเข้าไปอยู่ในจุดที่ว่างเปล่าและ ว่างสามารถเคลื่อนย้ายไปยังที่ที่ กระเบื้องในปัจจุบันคือ ดังนั้นที่นี่เราบอกว่าถ้าคณะกรรมการที่อยู่ในตำแหน่ง blank_i ลบ 1 blank_j ดังนั้นนี้จะพูดคือกระเบื้อง ดังกล่าวข้างต้นที่ว่างเปล่าในปัจจุบัน และถ้าเป็นเช่นนั้นเราจะต้องจำไว้ ที่เป็นตำแหน่งของกระเบื้อง กระเบื้องที่อยู่ในตำแหน่ง blank_i ลบ 1 และ blank_j ตอนแรกเรายังมีการตรวจสอบนี้ ที่นี่ blank_i เพื่อเป็น มากกว่า 0 ทำไมเราจึงต้องการที่จะทำเช่นนั้น ดีถ้าว่างเปล่าที่อยู่ในแถวบนสุด ของคณะกรรมการแล้วเราไม่ต้องการที่จะ มองไปที่ว่างเปล่าสำหรับกระเบื้องตั้งแต่ มีอะไรไปด้านบน แถวของคณะกรรมการ นี่คือวิธีที่คุณอาจจะจบลงด้วยการ บางอย่างเช่นความผิดส่วนหรือ โปรแกรมของคุณก็จะทำงาน ในรูปแบบที่ไม่คาดคิด ดังนั้นนี้คือการทำให้แน่ใจว่าเราทำไม่ได้ ดูในสถานที่ที่ไม่ถูกต้อง ตอนนี้เรากำลังจะทำในสิ่งที่เหมือนกันสำหรับ ทั้งหมดผสมเป็นไปได้อื่น ๆ ดังนั้นที่นี่เรากำลังมองหาด้านล่างที่ว่างเปล่า เพื่อดูว่าที่เป็นกระเบื้อง และเรายังมีเพื่อให้แน่ใจว่าเรา ไม่ได้อยู่ในแถวด้านล่างหรืออื่น ๆ ที่เรา ไม่ควรมองหากระเบื้อง ที่นี่เรากำลังจะมองไปทางด้านซ้ายของ ว่างเพื่อดูว่าจะเป็นกระเบื้อง และเราไม่ควรจะมองไปทางซ้าย ถ้าเราอยู่ในคอลัมน์ซ้ายสุด และที่นี่เรากำลังจะมองไปที่ ด้านขวาของว่างและเราไม่ควร มองไปทางขวาถ้าเรา ในคอลัมน์ขวาสุด ดังนั้นถ้าไม่มีสิ่งเหล่านั้นเป็นจริง นั่นหมายความว่ากระเบื้องที่ไม่ติดกัน ที่ว่างเปล่าและเราสามารถกลับเท็จ ย้ายไม่ถูกต้อง แต่ถ้าหนึ่งในบรรดาเป็นจริงแล้วที่ จุดนี้เรารู้ tile_i ที่และ tile_j เท่ากับ ตำแหน่งของกระเบื้อง และเพื่อให้เราสามารถปรับปรุงคณะกรรมการที่ ตำแหน่ง tile_i และ tile_j เรารู้ว่าค่าใหม่จะว่างเปล่า และที่ blank_i ตำแหน่ง blank_j ซึ่งเป็นต้นฉบับ เปล่า - เรารู้ว่ากระเบื้องเป็นไป ย้ายมี ขอให้สังเกตว่าเราไม่จริงต้องทำ แลกเปลี่ยนจริงที่นี่ตั้งแต่ที่เรารู้ ค่าที่ต้องการจะแทรก เข้าไปอยู่ในตำแหน่งที่ เราไม่จำเป็นต้องชั่วคราว ตัวแปรรอบ สุดท้ายเราต้องจำไว้ว่าเรา มีตัวแปรทั่วโลกของเราที่มี การติดตามตำแหน่ง ของว่าง ดังนั้นเราจึงต้องการที่จะปรับปรุงตำแหน่งของ ที่ว่างเปล่าให้เป็นที่กระเบื้อง แต่เดิมเป็น สุดท้ายเรากลับจริงตั้งแต่ การย้ายที่ประสบความสำเร็จ เราประสบความสำเร็จในการแลกเปลี่ยน ว่างด้วยกระเบื้อง ทั้งหมดขวาเราที่ผ่านมาดังนั้น จำเป็นต้องตรวจสอบที่ได้รับรางวัล ดังนั้นผลตอบแทนที่ได้รับรางวัลเหมือนกันบูลที่ ที่แท้จริงเป็นไปเพื่อแสดงว่า ผู้ได้รับรางวัลเกม และเท็จที่แสดงให้เห็นว่า เกมยังคงเป็นไป ผู้ใช้ไม่ได้รับรางวัล ดังนั้นนี้เป็นไปได้สวยมาก ตรงข้ามของ init ที่ init, จำได้ว่าเราเริ่มต้นที่คณะกรรมการ ถึง 15, 14, 13, 12, อื่น ๆ ในขณะที่ได้รับรางวัลเราต้องการที่จะตรวจสอบว่า คณะกรรมการคือ 1, 2, 3, 4, 5, และอื่น ๆ ดังนั้นเรากำลังจะเริ่มต้นของเรา นับ 1 นับว่าเป็นสิ่งที่ด้านบน ทางด้านซ้ายของคณะกรรมการที่ควรจะเป็น และจากนั้นเราจะห่วง ผ่านคณะกรรมการทั้ง ลองไม่สนใจสภาพนี้ เป็นครั้งที่สอง และเงื่อนไขนี้เป็นเพียงการไป การตรวจสอบเป็นคณะกรรมการในตำแหน่งนี้ เท่ากับจำนวนปัจจุบัน ถ้าเป็นเช่นนั้นเพิ่มขึ้นนับว่า ตำแหน่งต่อไปเรามองไปที่การเป็นหนึ่งในที่สูง กว่าตำแหน่งที่เราอยู่ในตอนนี้ เพื่อให้เป็นวิธีที่เราได้รับ ด้านบนซ้ายควรจะ 1 เพิ่มขึ้นนับถึง 2 มองไปที่ตำแหน่งถัดไป นี้เป็น 2 หรือไม่? ถ้าเป็นเช่นนั้นเพิ่มขึ้นนับถึง 3 ตำแหน่งต่อไปนี้เป็น 3? ถ้าเป็นเช่นนั้นเพิ่มขึ้นนับ 4 และอื่น ๆ ดังนั้นถ้ามีตำแหน่งใด ๆ ใน คณะกรรมการที่ไม่ได้นับเท่ากับของเรา แล้วเราต้องการที่จะกลับเท็จตั้งแต่ที่ หมายความว่ามีกระเบื้องบางอย่างที่เป็น ไม่ได้อยู่ในตำแหน่งที่ถูกต้อง ดังนั้นที่นี่สิ่งที่เป็นสภาพนี้ทำอะไร ดีจำไว้ว่าเป็นที่ว่างเปล่า ควรจะไปด้านล่างขวา และค่าว่างที่อาจจะไม่ จำเป็นต้องเท่ากับค่าของ นับว่าเป็นไปได้ถึง ที่ด้านล่างขวา ดังนั้นเราจึงต้องการเฉพาะในการตรวจสอบถ้าฉัน เท่ากับเท่ากับงลบ 1 และเจเท่ากับ เท่ากับงลบ 1 - ที่บอกว่าถ้าเรา กำลังมองหาที่ด้านล่างขวาของ กระดาน - แล้วเราก็ ต้องการดำเนินการต่อ เราต้องการที่จะข้ามนี้โดยเฉพาะ ทวนของห่วงสำหรับ ดังนั้นถ้าเราจัดการที่จะได้รับผ่านทางนี้ สำหรับวงซ้อนกันว่าหมายความว่า มีกระเบื้องที่อยู่ในไม่มี ตำแหน่งที่ไม่ถูกต้อง และเราแยกออกจากวงและมา ที่นี่ที่เราสามารถกลับจริง กระเบื้องทั้งหมดที่อยู่ในตำแหน่งที่ถูกต้อง และนั่นหมายความว่าผู้ใช้มี ชนะเกม และที่มัน ชื่อของฉันคือร็อบโบว์และนี่คือ 15