AIZU ONLINE JUDGE

AOJ ITP2 10_C(Bit Flag)を解く

AOJ_ITP2_10_C

Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の10_C問題をC++で解いてみました。

ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#10では、ビットセットI(bitset)を学びます。

問題(10_C: Bit Flag)

問題はリンク先をご覧ください。

AOJ ITP2 10_C問題: Bit Flag

bitset クラスについて学びます。

bitset クラスについて

以下は、cpprefjp 様の記事を参考にさせていただきました。

今回使う bitset クラスの演算子は、10_A で紹介しています。

C++ プログラム例(ITP2 10_C)

64個のフラグを64ビット2進数と考えて、以下の操作を行います。初期値は0とします。

  • test(i):i番目のフラグの状態がONの場合1、OFFの場合0を出力する。
  • set(i):i番目のフラグをONにする。
  • clear(i):i番目のフラグをOFFにする。
  • flip(i):i番目のフラグを反転する。
  • all:全てのフラグがONになっている場合1、なっていない場合0を出力する。
  • any:いずれかのフラグがONになっている場合1、なっていない場合0を出力する。
  • none:全てのフラグがOFFになっている場合1、なっていない場合0を出力する。
  • count:ONになっているフラグの数を出力する。
  • val:状態の整数値を出力する(64ビット整数に変換して出力する)。

64ビット整数0を引数に bitset クラスのコンストラクタを呼び出し(8行目)、クエリに従い、bitset クラスのメソッドを呼び出します。bitset クラスに関係するコードの背景色を変更しました。

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
	bitset<64> x(0ULL);

	int q;
	cin >> q;
	for (int j = 0; j < q; ++j) {
		int command;
		cin >> command;
		int i;
		switch (command){
		case 0:
			cin >> i;
			if (x.test(i)) {
				cout << 1 << endl;
			} else {
				cout << 0 << endl;
			}
			break;
		case 1:
			cin >> i;
			x.set(i);
			break;
		case 2:
			cin >> i;
			x.reset(i);
			break;
		case 3:
			cin >> i;
			x.flip(i);
			break;
		case 4:
			if (x.all()) {
				cout << 1 << endl;
			} else {
				cout << 0 << endl;
			}
			break;
		case 5:
			if (x.any()) {
				cout << 1 << endl;
			} else {
				cout << 0 << endl;
			}
			break;
		case 6:
			if (x.none()) {
				cout << 1 << endl;
			} else {
				cout << 0 << endl;
			}
			break;
		case 7:
			cout << x.count() << endl;
			break;
		case 8:
			cout << x.to_ullong() << endl;
			break;
		default:
			break;
		}
	}

	return 0;
}

上記プログラムは、AOJ で「AC(Accepted=正解)」と判定されました。

最後に

今回は、bitset クラスで使えるメソッドを試しました。問題自体が bitset クラスのメソッドを試すように作られていました。

引き続き、ITP2 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA