如何評價日本求職平臺發售的遊戲《程式設計師死絕的世界》?
剛剛通關, A級題目的翻譯以及我做法的程式碼在文末. 感興趣的知友可以去看一看...
-------------------------------------
剛又優化了一下做法, 上傳等結果了...
好像除了排行榜以外沒有獲取自己得分的途徑, 而排行榜15分鐘才更新一次...讓人等得有點難受呢orz...
------------------------------------
唔姆, 出來了...分數確實高了一點...文末程式碼已更新.
我的做法應該這樣就到頭了...
除了遍歷想不出來更好的做法了...然而遍歷的程式碼又不會寫...判斷是否有路徑什麼的簡直emmm....orz
以下為原回答
大一萌新
因為下學期準備修java所以這個寒假開始自學java...正好看到這個遊戲, 立馬就去玩了一下
開始介面有挺精良的2Dlive
進入遊戲以後有說明背景設定的OP動畫, 第一次開啟每個介面也都有說明動畫...並且全部可以跳過.
換裝也挺好看的...唔姆...
題庫很薄, 一共就5道D級, 三道C, 三道B和一道A. 不知道後續會不會更新地圖追加活動什麼的.
A級我還沒仔細看, 不過B級及以下的題是真的挺簡單的, 我這種剛學三天java的萌新都能做得出來...當然程式碼好不好看效率高不高那是另一回事...
不過就遊戲介面所展現的資訊來說, 她好像對效率完全沒有要求, 輸入的資料最大也就是1至100這樣, 所以無腦寫遍歷就行了...
比如我昨晚做的 高層タワー
就是輸入N個單詞, 讓你把它們首尾順次相連, 併合並重復的部分.
需要注意的是, 這裡重複的部分指的是下一個單詞跟前面所有單詞合併後得到的單詞的重複部分...比如輸入paiza apple paizappletter, 輸出依舊是paizappletter.
我一開始沒注意到這點, 單純的把相鄰的單詞兩兩比較然後輸出...本地AC了但傳上去老是不對, 弄了好久才發現問題...
這是修改以後傳上去終於對了的程式碼
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); String[] in = new String[n]; int[] k = new int[n]; int sum=0; char a[][] = new char[n][]; for (int i = 0; i < n; i++) { in[i] = input.next(); k[i] = in[i].length(); sum+=k[i]; } int b[]=new int[sum]; for (int i = 0; i < n; i++) { a[i] = new char[k[i]]; } for (int i = 0; i < n; i++) { for (int j = 0; j < k[i]; j++) { a[i][j] = in[i].charAt(j); } } for (int i = 0; i < k[0]; i++) { b[i]=a[0][i]; } int min[]=new int[n-1]; int max=0; int t=0; sum=k[0]; for (int i = 0; i < k[0]; i++) { System.out.print(a[0][i]); } for (int i = 0; i < n - 1; i++) { if(sum<k[i+1]) min[i]=sum; else min[i]=k[i+1]; for (int j = 0; j < min[i]; j++) { for (int l = 0; l < j+1; l++) { if(b[sum-l-1]!= a[i+1][j-l]) t+=1; } if(t==0) max=j+1; t=0; } for (int j = 0; max+j<k[i+1] ; j++) { System.out.printf("%c", a[i+1][max+j]); b[sum+j]=a[i+1][max+j]; } sum+=k[i+1]; sum=sum-max; max=0; } System.out.println(); } }
目前就說這些...等我做完A級以外的題以後一定再來更新.jpg
啊剛說完就有新進展了...
達成度到了50%以後取回的RIN的記憶...交代了RIN在崩壞前的世界裡是一個在研究所和IT設施間巡迴調查的機器人. 由於E病毒的爆發導致工程師不足, 其他機器人一個接一個出故障倒下, 而我們的RIN是由活著的最後一個工程師親手操作進入休眠狀態才得以倖存的. 現在因為重拾程式設計的人的活躍行動, RIN再啟動了.
緊接著解鎖了"傷心"表情.
唔姆, 看來可以期待一下達成度100%以後的ED動畫了(
(通關後注: 並沒有ED動畫QAQ)
把C級及以下問題全部做完, 加上一道B, 達成度到了75%, 解鎖了"笑容"表情.
かわええ~
除了A級題以外全部做完了...
確實很簡單...沒什麼說頭...
等我做完這道A級題我就去學面向物件.jpg
更新一下A級題目的翻譯...萌新已經看懵了..完全不知道怎麼做orz
您被委任設計一個新城鎮. 該城鎮南北縱長為H, 東西橫長為W, 面積共計H×W.
建築物佔地為矩形, 並含有一個門. 你要設計一個程式來決定他們的擺放位置. 他們的擺放位置應遵守以下三個原則:
- 任意兩個建築物均不重疊.
- 不可改變建築物的朝向.(不能旋轉)
- 對於任意兩個建築物, 他們的門一定要由在小鎮內部且不經過任何建築物的空白路徑相連.
(比如圖中的灰色建築和綠色建築之間就是符合原則3的, 而灰色建築和藍色建築之間就不符合原則3.)
(接著他給出了原則3的數學表達...沒什麼意思而且挺囉嗦的, 我就略去不譯了.)
每個佔地面積為X的建築物能夠產生X萬円的利益.
請寫一個程式, 給出建築物的擺放位置, 並儘可能地使建築物產生的利益總額較大.
只需給出正確放置了至少一個建築物的方案即可被視為正解. 建築物的總面積將計為得分.
輸入的資料格式如圖.
其中H為城鎮的南北縱長, W為城鎮的東西橫長. N為可供放置的建築物的數目.
h_i表示第i個建築物的縱長, wi表示其橫長. r_i表示門相對於該建築的橫座標, c_i表示門的縱座標. 如圖所示.
輸入資料的限制條件.
只翻譯有文字的最後三個條件.
· 座標(r_i, c_i)一定落在建築物外圍. (即, r_i = 1或r_i = h_i或c_i = 1或c_i = w_i至少有一個成立)
· 座標(r_i, c_i)不會落在建築物的四個角落. (即(r_i,c_i)既不是(1,1),也不是(1,1,w_i),(h_i,1)或(h_i,w_i))
· 可以保證能至少配置一個建築物.
輸出格式.
· 輸出一個有H行, 每行包含W個由半形空格字元隔開的整數的點陣.
· 每個整數表示對應的建築物的編號. 如此處沒有建築物, 則應為0.
· 在最後一行的末尾插入一個新行, 而不包含任何額外字元或空行.
輸入輸出的範例:
姑且寫了一個最最最簡單的做法把題給過了...
單純過題還是很簡單的...我是完全放棄考慮門的方向, 直接在每個建築物周圍都留了一圈空來保證門一定能連通的做法...最後加了個補丁保證了即使所有建築物的長或寬都有跟小鎮相同也會放一個面積最大的建築物上去.
最後把程式碼放上來給大家看看樂呵樂呵.如果有知友有更好的演算法請務必告知.
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner input=new Scanner(System.in); int H=input.nextInt(); int W=input.nextInt();//取得小鎮的長寬 int N=input.nextInt();//建築物的個數 int town[][]=new int[H][W]; for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { town[i][j]=0; } }//初始化小鎮 int[] h=new int[N], w=new int[N], r=new int[N], c=new int[N]; int judge=0;//判斷用引數 int x[]=new int[N];//位置引數 for h int y[]=new int[N];//位置引數 for w for (int i = 0; i < N; i++) { h[i]=input.nextInt(); w[i]=input.nextInt(); r[i]=input.nextInt(); c[i]=input.nextInt(); x[i]=1; y[i]=1; }//取得所有建築的引數並初始化x和y int[] h_l=new int[N], w_l=new int[N];//門在最右側,將要放於最左側的建築物群 int H_l=0;//其豎直總長 for (int i = 0; i < N; i++) { if(c[i]==w[i] && H_l+h[i]<H ){ H_l+=h[i]; h_l[i]=h[i]; w_l[i]=w[i]; h[i]=0; w[i]=0;//轉移資料 x[i]=0;//將位置座標移動至最左上 while(x[i]<H) { for (int j = 0; j < h_l[i]; j++) { if (x[i] + j< H) { if (town[x[i] + j][0] != 0) judge += 1; } else { judge += 1; } }//遍歷建築物即將擺放的豎直方向檢查是否有建築物 if (judge == 0) { for (int j = 0; j < h_l[i]; j++) { for (int k = 0; k < w_l[i]; k++) { town[x[i] + j][k] = i + 1; } }//若沒有建築物,則對town座標賦值並跳出while迴圈 break; } else if (x[i] < H) { x[i] += 1; judge = 0;//初始化judge }//若有, 則使x+=1, 繼續while迴圈. } x[i]=1;//初始化x[i] } } for (int i = 0; i < N; i++) { //對編號為i的建築進行操作 while(x[i]<H&&y[i]<W) { for (int j = 0; j < h[i] + 2; j++) { for (int k = 0; k < w[i] + 2; k++) { if (x[i] + j -2< H - 1 && y[i] + k -2< W - 1) { //減1留出地圖周邊位置 if (town[x[i] + j - 1][y[i] + k - 1] != 0) judge += 1; } else { judge += 1; } } }//遍歷建築物即將擺放的位置及其周邊檢查是否有建築物 if (judge == 0) { for (int j = 0; j < h[i]; j++) { for (int k = 0; k < w[i]; k++) { town[x[i] + j][y[i] + k] = i + 1; } }//若沒有建築物,則對town座標賦值並跳出while迴圈 break; } else if (x[i] < H - 1) { x[i] += 1; judge = 0;//初始化judge } else { x[i] = 1; y[i] += 1; judge = 0;//初始化judge }//若有, 則改變x和y以遍歷座標, 並迴圈遍歷 } judge=0;//初始化judge }//遍歷N個建築物結束 judge=0;//迴圈結束,初始化judge for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { if(town[i][j]==0) judge+=1; } }//判斷空白的個數 if(judge==H*W){ int square[]=new int[N];//各建築的面積 int the_max=0;//最大面積建築對應的編號 for (int i = 0; i <N; i++) { square[i]=h[i]*w[i]; if(square[the_max]<=square[i]) the_max=i; }//計算編號為i的建築物的面積並找出最大面積的建築物 for (int i = 0; i < h[the_max]; i++) { for (int j = 0; j < w[the_max]; j++) { town[i][j]=the_max+1; } }//對town座標賦值 }//若所有town均為空白, 則找出面積最大的建築物並放置於town中 for (int i = 0; i < H; i++) { for (int q = 0; q < W; q++) { System.out.print(town[i][q]); if (q!=W-1) System.out.print(" "); } System.out.println(); }//輸出結果 } }
來源:知乎 www.zhihu.com
作者:夏娜
【知乎日報】千萬使用者的選擇,做朋友圈裡的新鮮事分享大牛。點選下載
此問題還有24 個回答,檢視全部。