見出し画像

counting roadsの問題を解くためのメモ

counting roadsという問題の概要

N個の都市があり、M本の道路があり、それぞれの都市について、都市と都市をつなぐ道路が何本あるか数える問題。

N = 4、M = 3のとき
入力
4 3
1 2
2 3
1 4

出力
2
2
1
1

都市が4個、道路が3本、都市と都市を2列で表現し、隣り合う都市に道路がつながっていると考える。
都市は4個なので、都市1、都市2、都市3、都市4を2列で入力することになる。
道路は3本なので、3行で4つの都市を上記のように入力する。

出力は、都市1とつながっている道路は何本あるか、都市2とつながっている道路は何本あるか、…という感じでカウントするので、結局、入力した2列の都市のそれぞれの都市の数をカウントすること=それぞれの都市がつながっている道路の本数なので、

入力した都市を数える処理を行う。

1.入力を受け取る
縦方向がM行、横方向は常に2列なので2列の2次元配列として受け取る。vectorの2次元配列にする。

2.vectorの2次元配列に受け取った都市1~都市N個を都市ごとにカウントする。

3.カウントした値を出力する。

#include <bits/stdc++.h>
using namespace std;
int main() {
	int N, M;
	int k = 1;
	int count = 0;
	cout << "N,Mを入力してください" << endl;
	
	cin >> N >> M;
	
	vector<vector<int>> data(M, vector<int>(2));
	// 入力
	for(int i = 0; i < M; i++){
		for(int j = 0; j < 2; j++){
			// cinで入力をvector配列に代入
			cin >> data.at(i).at(j);
		}
	}
	// dataに入った要素の各数値をカウントし出力
	while(k <= N){
		for(int i = 0; i < M; i++){
			for(int j = 0; j < 2; j++){
				if(data.at(i).at(j) == k){
					count++;
				} else {
					continue;
				}
			}
		}
		cout << "N= " << k << "カウント値は " << count << " です。" << endl;
		count = 0;
		k++;
	}
	return 0;
}

vectorの2次元配列にいれたデータのカウントが難しく感じました。

普通にfor文を2重でループするだけでは、vectorの要素を1周してループを抜けてしまうので、カウント処理が難しい。

そこで、思いついたのが、for文をwhileでくくって、Nの各値をkとする。

for文の2重ループを抜ける=vectorの要素全てを一通り1回ループする

なので、2重ループの中でvectorの要素がk=1でないかを判定し、1ならカウンタを増やす。2重ループを抜けたらvectorの要素が1のカウント値を出力して、kを+1インクリメントしてまたfor文の2重ループに入り、今度はvectorの要素がk=2かどうかを判定しカウントする処理をする。k=Nになるまでwhileによって繰り返す。という処理にしました。






この記事が気に入ったらサポートをしてみませんか?