>> 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