문제에는 연료량의 두배라고 되어있지만 연료를 그때마다 소비하지 않고, 도착할 수 있는지만 확인했기 때문
탐색 프로세스가 종료되었다면 isArrived를 통해 모든 승객의 도착여부를 확인한다.
5. 전체 코드
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#define X first
#define Y second
usingnamespacestd;usingpii=pair<int,int>;intN,M,C;introad[25][25];structstatus{intx,y,d;};structinfo{intsx,sy,ex,ey;boolisArrived;};vector<info>passengers;piitaxi;inttaxiC;intdx[]={-1,1,0,0};intdy[]={0,0,-1,1};booloom(intx,inty){returnx<1||y<1||x>N||y>N;}voidinput(){cin>>N>>M>>C;taxiC=C;for(inti=1;i<=N;i++)for(intj=1;j<=N;j++)cin>>road[i][j];cin>>taxi.X>>taxi.Y;for(inti=0;i<M;i++){intsx,sy,ex,ey;cin>>sx>>sy>>ex>>ey;passengers.push_back({sx,sy,ex,ey,false});}}intgetDistance(intsx,intsy,intex,intey){queue<status>q;boolvis[25][25]={false,};q.push({sx,sy,0});vis[sx][sy]=true;while(!q.empty()){autocur=q.front();q.pop();if(cur.x==ex&&cur.y==ey)returncur.d;if(cur.d>taxiC)continue;for(intdir=0;dir<4;dir++){intnx=cur.x+dx[dir];intny=cur.y+dy[dir];if(oom(nx,ny)||vis[nx][ny])continue;if(road[nx][ny]==0){q.push({nx,ny,cur.d+1});vis[nx][ny]=true;}}}return-1;}structprior{intx,y,d,idx;};boolcompare(prior&a,prior&b){if(a.d==b.d){if(a.x==b.x)returna.y<b.y;returna.x<b.x;}returna.d<b.d;}piicarry(){vector<prior>tmp;for(inti=0;i<passengers.size();i++){info&cur=passengers[i];if(cur.isArrived)continue;intdistance=getDistance(taxi.X,taxi.Y,cur.sx,cur.sy);if(distance==-1)continue;tmp.push_back({cur.sx,cur.sy,distance,i});}sort(tmp.begin(),tmp.end(),compare);if(tmp.size()>0)return{tmp[0].d,tmp[0].idx};elsereturn{-1,-1};}intmoveTaxi(info&cur){taxi={cur.sx,cur.sy};intdistance=getDistance(taxi.X,taxi.Y,cur.ex,cur.ey);if(distance==-1)return-1;taxi={cur.ex,cur.ey};cur.isArrived=true;returndistance;}intmain(void){ios::sync_with_stdio(false);cin.tie(NULL);// freopen("input.txt", "r", stdin);input();while(true){autotarget=carry();if(target.first==-1)break;taxiC-=target.first;intdistance=moveTaxi(passengers[target.second]);if(distance==-1)break;taxiC+=distance;}for(info&cur:passengers)if(!cur.isArrived){cout<<-1;return0;}cout<<taxiC;return0;}
6. 소감
골드2라는 난이도에 비해 문제가 쉽게 느껴졌다.
BFS 로직에서 어처구니 없는 실수를 해서 맞왜틀을 시전해버렸다.
문제를 풀다가 조금 졸렸는데 아직도 저기에 왜 참조자를 사용한지 모르겠다.
참고로 초기에 값을 참조하고 해당 주소를 pop 해버리는데 이런 걸 댕글링 포인터라고 한다.
포인터가 해제된 영역을 가리키고 있는 상태
while(!q.empty()){auto&cur=q.front();// 참조자를 사용해서q.pop();// 여기에 오면 댕글링 포인터가 됨....for(intdir=0;dir<4;dir++){...if(road[nx][ny]==0){q.push({nx,ny,cur.d+1});// 이 부분에서 cur의 값이 계속 변경되었다!vis[nx][ny]=true;}}}