تمرین دیسک ها
یکی از فعالیت های ما ارائه و حل تمرین های برنامه نویسی می باشد.
در این نوشته قصد حل تمرینی با عنوان “دیسک ها” را با زبان برنامه نویسی جاوا داریم.
با ما همراه باشید.
پیشنهاد نویسنده : تمرین طول سیم ها حل شد.
تمرین دیسک ها
تعداد 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 حل شده است.
برای پیشنهاد حل مسئله توسط ما می توانید از بخش نظرات آدرس سوال یا متن سوال را فرستاده و در صورت امکان به آن سوال پاسخگویی خواهد شد.
در صورتی که علاقه به مشارکت دارید می توانید “تمرین دیسک ها” را با زبان های دیگر برنامه نویسی حل کرده و برای ما ارسال کنید تا با نام شما برای دیگران به اشتراک بگذاریم.
ارسال پاسخ