「人生を書き換える者すらいた。人材募集企画 2011年版」 やってみた。 - kyuridenamidaのチラ裏
↑これ。
もう公開可能時期過ぎてたので公開しようと思うます。
といっても、実は当時のソース紛失したのでさっき急いで書きました。
1番:
なんかよくわかんないけど与えられた数"以上"で最小の2^nで表せる数を表示するんだと思います。
0の時も最後の+1によってうまくいくのがナウい。
イメージ的には自分を複製していってビットをフルに満たした上での+1なので2^nの形になります。
2番:
ソース無くしたので急いで書いた。10分程度とかいってましたがやっぱりデバッグ含めたら15分くらいは最低でも掛かるらしいです。ごめんなさい。いちおう速いつもりでしたがソースは汚くて、僕が採用する側だったら間違いなくrejectしてる。カンマ演算子等悪質。
(23:23)入力気に食わなかったので弄った。出力はかなり適当ですごめんなさい
#include <iostream> #include <vector> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) int dx[] = {1,0,-1,0}; int dy[] = {0,1,0,-1}; bool down(vector<string> &d){ bool changed = false; rep(i,13)rep(j,6)rep(k,12){ if(d[k][j] != ' ' && d[k+1][j] == ' ')swap(d[k+1][j],d[k][j]) ,changed = true; } return changed; } bool done[100][100] = {0}; vector<string> puyo(19); void init(){ rep(j,100)rep(i,100)done[i][j] = false; } int rec(int x,int y,char color , bool remove){ if(puyo[y][x] != color || done[y][x])return 0; else if(remove)puyo[y][x] = ' '; done[y][x] = true; int ret = 1; rep(i,4){ int tx = x+dx[i] , ty = y+dy[i]; if(tx < 0 || ty < 0 || tx >= 6 || ty >= 13)continue; ret += rec(tx,ty,color,remove); } return ret; } int main(){ rep(i,13){ getline(cin,puyo[i]); puyo[i].substr(0,6); } bool f; rep(i,13)cout << puyo[i] << endl; do{ f = down(puyo); rep(i,13)cout << puyo[i] << endl; rep(i,13)rep(j,6){ if(puyo[i][j] != ' '){ if( init(),rec(j,i,puyo[i][j],false) >= 4){ init(),rec(j,i,puyo[i][j],true); f = true; } } } }while(f); }