USACOの対象は、私はかなり不思議な感じ。
1. DFS(BFS)トラバーサルは:(良い書き込みは、紙DFSが勝つためにDFSを検索するために怠け者ではない)
2. STLセット(マップ)の基本的な使い方:データが大きい場合、ダイレクト入金はできません。
それは干し草の検索を記録することはできませんので、囲まれたわらの周囲を起こすことができないので、そのよう探し出すための内周の周りに刈るする必要はありませんが記録されます。
そのようなものとして、それは、図です。周囲は(赤い部分)である。
最も外側のポイントの一つを見つける必要があるので、あなたはそれが非常にすることを、検索のトップ位置(青)のポイント充当見つけることができる
草の答えに検索すると、検索の開始の上からの++ 、復帰。
しかし、それは直接爆破する場合は、この検索には時間が不足してきた、我々はこのような状況ではそうならば、少なくとも、干し草の山、青の各位置での8つの方向のための細胞で見つけることができていてはいけません何の出口に雑草ません。
#include<bits/stdc++.h>
#define rap(i,first,last) for(int i=first;i<=last;++i)
using namespace std;
const int move_x[9]={233,0,0,1,-1,1,1,-1,-1};
const int move_y[9]={233,1,-1,0,0,1,-1,1,-1};
set<pair<int,int> >_map;//用来记录这张图
set<pair<int,int> >visit;//用来判断这个位置有没有走过
int N,fx=-1,fy,answer=0;
bool OutSide(int x,int y)//判断八个方向上有没有草堆
{
rap(i,1,8)
if(_map.count(make_pair(x+move_x[i],y+move_y[i])))return 0;//有就返回0
return 1;//没有返回1
}
void DFS(int x,int y)//DFS
{
if(_map.count(make_pair(x,y)))//如果这个位置是草堆就answer++,return
{
answer++;
return;
}
if(visit.count(make_pair(x,y)))return;//走过了就不能在走了
visit.insert(make_pair(x,y));//记录这个位置走过
if(OutSide(x,y))return;//如果八个方向上没有草堆则return
rap(i,1,4)//向四个方向搜索
DFS(x+move_x[i],y+move_y[i]);
}
int main()
{
scanf("%d",&N);
int x,y;
rap(i,1,N)
{
scanf("%d%d",&x,&y);
_map.insert(make_pair(x,y));//地图中这个位置有草堆
if(x>fx)
{
fx=x;
fy=y;
}
}
DFS(fx+1,fy);//最上方那个点上方的那个点开始搜索
printf("%d",answer);//输出answer
return 0;
}