CCF-回收站選址

阿蘭若小菜鳥發表於2020-12-05

(一)、題目描述
原題目連結:
[http://118.190.20.162/view.page?gpid=T99]
(二)、題目分析:
1.為什麼用map來寫?
不能建立矩陣,因為有非第一象限的座標點;
無法使用二維陣列儲存,不能很好的找到座標點之間的關係;
所以用map來寫。
2.採用map來寫的關鍵思想?
本題採用map編寫程式的關鍵思想:把5個得分設為一維陣列的下標,這種方法真的很高明。
(三)、程式碼描述
本題程式碼是參考的別人的,自己給程式碼加了註釋;
程式碼參考連結:
https://www.cnblogs.com/blink-cz/p/12650727.html
對以上鍊接新增註釋:

#include<bits/stdc++.h> 
#include<map>
using namespace std;
const int N=5;  //五種型別的得分 0 1 2 3 4 
int ans[N]={0};  //陣列初始化為0; 
const int M=1000;  // 測試資料 n小於等於1000; 
pair<int ,int> p[M];  //pair是將2個資料組合成一個資料,存放一個鍵值對
int main()
{
	int n;
	cin>>n;
	int x,y;
	map<pair<int,int>,int> m;  //建立一個map m; 
	//將座標設定為鍵,將1設定為值標記有垃圾的座標;
	for(int i=0;i<n;i++)
	{
		cin>>x>>y;
		p[i]=make_pair(x,y); //呼叫make_pair生成pair物件
		m.insert(make_pair(p[i],1));   //將鍵值插入map; 
	}

	for(int i=0;i<n;i++)
	{
		int x=p[i].first;
		int y=p[i].second;
		if(m.count(make_pair(x,y-1))&&m.count(make_pair(x-1,y))&&
		   m.count(make_pair(x,y+1))&&m.count(make_pair(x+1,y)))  
		    //m.count 存在即為1,不存在即為0; 
		{
			ans[m.count(make_pair(x+1,y+1))+m.count(make_pair(x+1,y-1))+
			    m.count(make_pair(x-1,y-1))+m.count(make_pair(x-1,y+1))]++;
		}
	}
	for(int i=0;i<5;i++)
	{
		cout<<ans[i]<<"\n";
	}
	cout<<endl;
	return 0;
}

(四)、結果驗證
CCF官網提交,滿分
(五)、關於map的知識點補充

相關文章