夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

2612,3650

PKUで簡単な問題をみつけるのは難しい。

2612

マインスイーパの復元化。サンプルだけみてると地雷を踏んでいるパターンをわすれがち

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int dx[] = {-1,0,1,-1,1,-1,0,1};
int dy[] = {-1,-1,-1,0,0,1,1,1};
int main() {
	int n; scanf("%d",&n);
	vector<string> mine(n), num(n);
	for (int i=0; i<n; i++) cin>>mine[i];
	for (int i=0; i<n; i++) cin>>num[i];
	bool touched = false;
	for (int i=0; i<n; i++) {
		for (int j=0; j<n; j++) {
			if (num[i][j]=='x') {
				int cnt=0;
				for (int k=0; k<8; k++) {
					if (j+dx[k]>=0&&j+dx[k]<n&&i+dy[k]>=0&&i+dy[k]<n&&mine[i+dy[k]][j+dx[k]]=='*') cnt++;
				}
				num[i][j]=(char)(cnt+48);
				if (mine[i][j]=='*') touched=true;
			}
		}
	}
	if (touched) {
		for (int i=0; i<n; i++) {
			for (int j=0; j<n; j++) {
				if (mine[i][j]=='*') num[i][j] = '*';
			}
		}
	}
	for (int i=0; i<n; i++) cout<<num[i]<<endl;
}

3650

文字列をURLっぽくする。
insertを使ったけどもっと上手い方法がありそう…

#include <iostream>
#include <string>
using namespace std;
int main() {
	string str;
	while (getline(cin,str)&&str!="#") {
		for (int i=0; i<str.length(); i++) {
			if (str[i]==' ') {
				str[i]='%';
				str.insert(i+1,"20");
			} else if (str[i]=='!') {
				str[i]='%';
				str.insert(i+1,"21");
			} else if (str[i]=='$') {
				str[i]='%';
				str.insert(i+1,"24");
			} else if (str[i]=='%') {
				str[i]='%';
				str.insert(i+1,"25");
			} else if (str[i]=='(') {
				str[i]='%';
				str.insert(i+1,"28");
			} else if (str[i]==')') {
				str[i]='%';
				str.insert(i+1,"29");
			} else if (str[i]=='*') {
				str[i]='%';
				str.insert(i+1,"2a");
			} else {
				continue;
			}
			i+=2;
		}
		cout<<str<<endl;
	}
}

総評

cinとかcoutとか禁止されたら自分文字列使えないことが判明した。やばばばい。