08年度-ACM-ICPC国内予選

2008C

回答者:ねいむ
所要時間:50分(打込み30分)/0ミス
予選時:クリア

ぱっと見難しそうで、始めはDからやろうと考えていたが、
よくよく見てみると検索・置換関数使い回しで全て処理しきれると確信。
個人的には6問中で最も自分と相性の良い問題だったと思う。

だが焦ってソースを打ち込んでいたため、
ミスはないと思いつつも、悪い意味で“非常にわかりやすい”コードになった。

それでもこれまでの人生で一番、打ってて楽しい(可笑しい?)と思ったソースコード。
これは永遠に記憶に残るに違いない。

#include <stdio.h>
#include <string.h>

bool replace(char* std_str, char* str, char* str2);
void main()
{
	int count;
	char std[80], edt[80];
	FILE *in,*out;
	in=fopen("c_in.txt","r");
	out=fopen("c_out.txt","w");

	while(true)
	{
		fscanf(in, "%s", std);
		if(strncmp(std, ".", 1) == 0) break;
		count = 0;
		for(int i = 0; i < 27; i++)
		{
			strcpy(edt,std);
			while(true)
			{
				// pqr
				switch(i)
				{
				case 0: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "0")) continue; break;
				case 1: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "1")) continue; break;
				case 2: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "2")) continue; break;
				case 3: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "0")) continue; break;
				case 4: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "1")) continue; break;
				case 5: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "2")) continue; break;
				case 6: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "0")) continue; break;
				case 7: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "1")) continue; break;
				case 8: if(replace(edt, "P", "0")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "2")) continue; break;
				case 9:  if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "0")) continue; break;
				case 10: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "1")) continue; break;
				case 11: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "2")) continue; break;
				case 12: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "0")) continue; break;
				case 13: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "1")) continue; break;
				case 14: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "2")) continue; break;
				case 15: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "0")) continue; break;
				case 16: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "1")) continue; break;
				case 17: if(replace(edt, "P", "1")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "2")) continue; break;
				case 18:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "0")) continue; break;
				case 19:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "1")) continue; break;
				case 20:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "0")) continue; if(replace(edt, "R", "2")) continue; break;
				case 21:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "0")) continue; break;
				case 22:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "1")) continue; break;
				case 23:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "1")) continue; if(replace(edt, "R", "2")) continue; break;
				case 24:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "0")) continue; break;
				case 25:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "1")) continue; break;
				case 26:  if(replace(edt, "P", "2")) continue; if(replace(edt, "Q", "2")) continue; if(replace(edt, "R", "2")) continue; break;
				}
				break;
			}

			while(true)
			{
				// -
				if(replace(edt, "-2", "0")) continue;
				if(replace(edt, "-1", "1")) continue;
				if(replace(edt, "-0", "2")) continue;
				// *
				if(replace(edt, "(0*0)", "0")) continue;
				if(replace(edt, "(0*1)", "0")) continue;
				if(replace(edt, "(0*2)", "0")) continue;
				if(replace(edt, "(1*0)", "0")) continue;
				if(replace(edt, "(1*1)", "1")) continue;
				if(replace(edt, "(1*2)", "1")) continue;
				if(replace(edt, "(2*0)", "0")) continue;
				if(replace(edt, "(2*1)", "1")) continue;
				if(replace(edt, "(2*2)", "2")) continue;
				// +
				if(replace(edt, "(0+0)", "0")) continue;
				if(replace(edt, "(0+1)", "1")) continue;
				if(replace(edt, "(0+2)", "2")) continue;
				if(replace(edt, "(1+0)", "1")) continue;
				if(replace(edt, "(1+1)", "1")) continue;
				if(replace(edt, "(1+2)", "2")) continue;
				if(replace(edt, "(2+0)", "2")) continue;
				if(replace(edt, "(2+1)", "2")) continue;
				if(replace(edt, "(2+2)", "2")) continue;
				break;
			}
			if(strcmp(edt, "2") == 0) count++;
		}
		fprintf(out, "%d\n", count);
	}
	fclose(in);
	fclose(out);
} 

bool replace(char* std_str, char* str, char* str2)
{
	char* index;
	char changed[80];
	memset(changed, 0, sizeof(char) * 80);
	index = strstr(std_str, str);
	if(index > 0)
	{
		strncpy(changed, std_str, (long)(index - std_str));
		strcat(changed, str2);
		strcat(changed, &index[strlen(str)]);
		strcpy(std_str, changed);
		return true;
	}
	return false;
}

良い子は真似しないでね。


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-21 (木) 11:25:35 (1611d)