تمرین دیسکها
یکی از فعالیتهای ما ارائه و حل تمرینهای برنامه نویسی است. در این نوشته قصد حل تمرینی با عنوان “دیسکها” را با زبان برنامهنویسی جاوا داریم.
تمرین دیسکها
تعداد n دیسک با اندازههای برابر و شمارههای ۱ تا n داریم. این n دیسک ابتدا هر کدام در یک پایه قرار گرفتهاند و n برج با ارتفاع یک ساختهاند.
دو مدل query زیر را داریم:
دستور Merge
این دستور دو ورودی را دریافت میکند؛ برجی که شامل دیسک x است را از پایهی خود خارج کرده و به همان ترتیب به روی پایهای که شامل دیسک y است اضافه میکنیم.
دستور Height
این دستور یک ورودی را دریافت میکند؛ این که دیسک x در برجی که شامل آن است در چه طبقهای قرار گرفته را چاپ میکند.
ورودی برنامه
در خط اول ورودی عدد m میاید که تعداد queryهایی که در ادامه میایند را مشخص میکند. در m خط بعدی درهر کدام یک query از دو نوع بالا داده میشود.
خروجی برنامه
به ازای هر دستور از نوع Height طبقهی دیسک موردنظر را در یک سطر چاپ کنید.
محدودیتها
این محدودیتها باید جز بخشهای کنترلی برنامه بماند.
n ≤ ۳۰۰۰۰
m ≤۱۰۰۰۰۰
مثال:
ورودی نمونه:
۹ Height 1 Merge 1 2 Height 1 Height 2 Merge 3 4 Merge 4 1 Height 2 Height 4 Height 3
خروجی نمونه:
۱ ۲ ۱ ۱ ۳ ۴
حل سوال تمرین دیسکها کوئرا
کلاس File
این کلاس وظیفه دریافت اطلاعات ورودی و انتقال نتایج به خروجی را دارد.
import java.io.*; public class File { private String input_path; private String output_path; public File() { this.input_path = "d://input.txt"; this.output_path = "d://output.txt"; } public String[] read() throws IOException { FileInputStream input = null; String[] data=null; int i=0; int array_bound=100000; try{ input = new FileInputStream(input_path); DataInputStream dataInputStream = new DataInputStream(input); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream)); String strLine; while ((strLine=bufferedReader.readLine()) != null) { if(data==null) { if(Integer.parseInt(strLine)<=100000) array_bound = Integer.parseInt(strLine); data = new String[array_bound]; continue; } else if(i==array_bound) { break; } data[i] = strLine + (char) 13 + (char) 10; i += 1; } } finally { if(input == null) { input.close(); } } return data; } public void write(String data, boolean append) throws IOException { BufferedWriter output = null; try { output = new BufferedWriter(new FileWriter(output_path, append)); if(data==null) output.write(""); else output.write(data + (char) 13 + (char) 10); output.close(); } finally { if(output == null) { output.close(); } } } }
کلاس Disk
این کلاس وظیفهی اجرای دستوراتی را دارد که از طریق کلاس File به آن رسیده است.
روال کلی برنامه، شروط، منطق و دستورات اصلی برنامه در این کلاس قرار دارند.
public class Disk { private int disk_bound; private int[][] disk_array; private int range(int tower) { int range=1; for (int i=0; i<disk_bound; i++) { if (disk_array[i][1] == tower && disk_array[i][2]>range) { range = disk_array[i][2]; } } return range+1; } public Disk() { disk_bound = 30000; disk_array = new int[disk_bound][3]; for (int i=0; i<disk_bound; i++) { disk_array[i][0]=i; disk_array[i][1]=i; disk_array[i][2]=1; } } public void merge(int x, int y) { if(x>30000 || y>30000) return; int old_tower = disk_array[x][1]; int range = range(disk_array[y][1]); for (int i=0; i<disk_bound; i++) { if(disk_array[i][1]==old_tower) { disk_array[i][1] = disk_array[y][1]; disk_array[i][2] = range + (disk_array[i][2] - 1); } } } public int height(int x) { return disk_array[x][2]; } }
کلاس Main
این کلاس اولین کلاس اجرایی توسط مفسر جاوا است که این کلاس وظیفهی واسط بین کلاس File و Disk را دارد.
import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { File file = new File(); file.write(null , false); Disk disk = new Disk(); String[] construction = file.read(); String[] job = new String[3]; int j=0; int x; int y; String output=""; for (String my_construction:construction) { j=0; job[0]=""; job[1]=""; job[2]=""; for (int i = 0; i < my_construction.length(); i++) { if (!Character.isWhitespace(my_construction.charAt(i))) { job[j] += String.valueOf(my_construction.charAt(i)); } else { j+=1; if(j>2) break; } } if(job[0].equals("Height")) { x = Integer.parseInt(job[1]); output = String.valueOf(disk.height(x)); System.out.println(output); file.write(output, true); } else if(job[0].equals("Merge")) { x = Integer.parseInt(job[1]); y = Integer.parseInt(job[2]); disk.merge(x, y); } } } }
در صورت وجود هر سوالی از بخش نظرات امکان پرسش سوال خود را دارید.
منبع سوال سایت quera.ir هست ولی این مسئله، به صورت اختصاصی توسط camelcase.ir حل شده است.
برای پیشنهاد حل مسئله توسط ما میتوانید از بخش نظرات آدرس سوال یا متن سوال را فرستاده و در صورت امکان به آن سوال پاسخگویی خواهد شد.
در صورتی که علاقه به مشارکت دارید میتوانید “تمرین دیسکها” را با زبانهای دیگر برنامه نویسی حل کرده و برای ما ارسال کنید تا با نام شما برای دیگران به اشتراک بگذاریم.
ارسال پاسخ