ในบทช่วยสอนนี้ เราต้องเขียนอัลกอริธึมเพื่อหาวิธีส่งงานโดยไม่ถูกผู้ควบคุมจับ นักเรียนแต่ละคนต้องส่งงานของตนไปยังผู้ควบคุมดูแล งานของนักเรียน A อยู่กับนักเรียน B ดังนั้นนักเรียน B จึงต้องส่งคืน/ส่งงานให้นักเรียน A โดยที่ผู้ควบคุมดูแลไม่สังเกตเห็น
นักเรียนทุกคนนั่งเป็นแถว เราต้องหาทางส่งงานคืนให้นักเรียน A โดยไม่ถูกจับได้ ข้อกำหนดต่างๆ ที่พวกเขาสามารถผ่านงานมอบหมายได้มีดังนี้ -
-
นักเรียน A (ที่ดัชนี i) สามารถส่งงานไปยังเพื่อนบ้านที่อยู่ในดัชนี (i-1) และ (i+1)
-
นักเรียนสามารถให้ รับ หรือเก็บงานไว้กับตัวได้
-
ผู้ควบคุมดูแลนักเรียนทุกคนจากดัชนี [il, rl]
-
เมื่อนักเรียนอยู่ในขอบเขตของนาฬิกาควบคุม จะไม่สามารถส่งหรือรับงานได้
-
ถ้านักเรียนเก็บงานไว้กับพวกเขาในขณะที่อยู่ในช่วงนั้น ผู้ควบคุมจะไม่จับมัน
เราได้รับสี่อินพุต p, q, r, s โดยที่ p คือจำนวนนักเรียนทั้งหมด q คือจำนวนขั้นตอนทั้งหมดในระหว่างที่ผู้ควบคุมดูแลจาก il ถึง rl c คือตำแหน่งของนักเรียน A และ d เป็นตำแหน่งนิสิต ข.
แต่ละขั้นตอน (q) มีสามอินพุต -
-
เวลาทั้งหมดที่ผู้ดูแลจะเฝ้าระวังในช่วงที่กำหนด
-
ผู้ควบคุมกำลังเฝ้าดูอยู่ในช่วงที่รวมไว้ทางซ้ายสุด
-
ผู้คุมกำลังเฝ้าดูช่วงที่เหมาะสมที่สุด
จำเป็นต้องมีลำดับเอาต์พุต 3 คำ:"ซ้าย" "ขวา" และ "รักษา" ซึ่งแสดงถึงกิจกรรมของนักเรียนหากพวกเขาส่งงาน (ซ้าย/ขวา) หรือเก็บไว้ ตัวอย่างเช่น
ขั้นตอน
ป้อนข้อมูล
8 3 2 7 1 4 6 2 1 8 3 5 6
ผลผลิต
Right Keep Right Right Right Right
คำอธิบาย
เมื่อทำตามคำแนะนำเหล่านี้ งานจะเข้าถึงจากนักเรียนที่ดัชนี 2 ถึงนักเรียนที่ดัชนี 7 โดยไม่ถูกตรวจจับ
ป้อนข้อมูล
5 1 1 3 1 2 5
ผลผลิต
Keep Right Right
คำอธิบาย
เมื่อทำตามคำแนะนำเหล่านี้ งานจะเข้าถึงจากนักเรียนที่ดัชนี 1 ถึงนักเรียนที่ดัชนี 3 โดยไม่ถูกตรวจจับ
แนวทางในการหาแนวทางแก้ไข
ในกรณีดังกล่าว หากผู้ควบคุมดูแลนาฬิกาอยู่ในระยะนั้น ไม่ว่าจะเป็นนักเรียนที่กำลังได้รับงานหรือนักเรียนที่จะส่งงานให้ นักเรียนคนนั้นก็จะเก็บงานนั้นไว้กับเขา มิฉะนั้น เขาจะส่งต่อให้นักเรียนที่อยู่ติดกันไปยังเป้าหมายสุดท้าย
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void solve(int p, int q, int r, int s, long t[], int l[], int ar[]){ int dir; string val; if (r < s) { dir = 1; val = "Right"; } else { dir = -1; val = "Left"; } string answer = ""; int i = 0, current = r; long tim = 1; while (1) { if (i < q && tim == t[i]) { if ((current >= l[i] && current <= ar[i]) || (current + dir >= l[i] && current + dir <= ar[i])) { answer += "Keep\n"; tim++; i++; continue; } i++; } current += dir; answer += val+"\n"; tim++; if (current == s) break; } cout << answer << endl; } int main(){ int p = 8, q = 3, r = 2, s = 7; long t[q + 2] = { 1,2,3 }; int l[q + 2] = { 4,1,5 }; int ar[q + 2] = { 6,8,6 }; solve(p, q, r, s, t, l, ar); return 0; }
ผลลัพธ์
Right Keep Right Right Right Right
บทสรุป
ในบทช่วยสอนนี้ เราเรียนรู้ที่จะเขียนอัลกอริทึมเพื่อค้นหาวิธีส่งงานโดยที่ผู้ควบคุมไม่สามารถจับได้พร้อมกับโค้ด c++ เรายังเขียนโค้ดนี้ในภาษาจาวา ไพธอน และภาษาอื่นๆ ได้ด้วย อัลกอริธึมข้างต้นเป็นอัลกอริธึมที่สำคัญสำหรับการแข่งขันการเข้ารหัส คำถามนี้รวมถึงปัญหาในชีวิตจริง ซึ่งเราแก้ไขด้วยโค้ด C++ เราหวังว่าคุณจะพบว่าบทช่วยสอนนี้มีประโยชน์