AIZU ONLINE JUDGE

AOJ ITP2 4_C(Swap)を解く

AOJ_ITP2_4_C

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

ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#4では、列に対する変更を学びます。

#3から#6は、alogrithm をインクルードして利用する機能を紹介します。全てのアルゴリズムは、データ構造の実装から切り離されています。アルゴリズムの要件(主にイテレータ)を満たせば動作します。

問題(4_C: Swap)

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

AOJ ITP2 4_C問題: Swap

指定された範囲の要素を入れ替える swap_ranges について学びます。

std::swap_ranges について

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

std::swap_ranges は、指定された範囲の要素を入れ替えます。

  template <class ForwardIterator1, class ForwardIterator2>
  ForwardIterator2
    swap_ranges(ForwardIterator1 first1,
                ForwardIterator1 last1,
                ForwardIterator2 first2); 

指定された2つの範囲 [first1, last1) と [first2, (last1 – first1)) を入れ替えます。単純に要素毎に入れ替えるだけなので、範囲が重なっていることは許されていません。

2つ目の範囲の最後の要素を指す first2 + (last1 – first1) を返します。正確に (last1 – first1) 回の swap を行います。

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

配列 A が与えられて、q 個の操作が与えられます。1回の操作で指定された範囲の swap_ranges を行います(21行目)。最後に A を出力します。

以下は、C++のプログラムです。

#include <iostream>
#include <algorithm>

#include <vector>

using namespace std;

int main()
{
	int n;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}
	int q;
	cin >> q;
	for (int i = 0; i < q; ++i) {
		int b, e, t;
		cin >> b >> e >> t;
		swap_ranges(a.begin() + b, a.begin() + e, a.begin() + t);
	}

	for (int i = 0; i < n; ++i) {
		cout << a[i] << " \n"[i == n - 1];
	}

	return 0;
}

一方、swap_ranges を知らなくても swap を使うことで、問題を解くことができます。21から27行目が swap_ranges に相当する処理になります。

#include <iostream>
#include <algorithm>

#include <vector>

using namespace std;

int main()
{
	int n;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}
	int q;
	cin >> q;
	for (int i = 0; i < q; ++i) {
		int b, e, t;
		cin >> b >> e >> t;
		auto it1 = a.begin() + b;
		auto it2 = a.begin() + t;
		while (it1 != a.begin() + e) {
			swap(*it1, *it2);
			++it1;
			++it2;
		}
	}

	for (int i = 0; i < n; ++i) {
		cout << a[i] << " \n"[i == n - 1];
	}

	return 0;
}

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

最後に

最初にこの問題を読んだときには、swap_ranges を知りませんでした。このコースは、問題を解くためのちょうどよいライブラリがあることが多く、調べてみたら swap_ranges が見つかりました。また新しいことを学ぶことができました。

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

COMMENT

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

CAPTCHA