https://www.acmicpc.net/problem/1525
우선은 아래와 같이 코드를 짜보려고 시도했습니다.
-----------------------------------------------------------
#include <stdio.h>
#include <set>
#include <queue>
#include <math.h>
using namespace std;
set <int> Set;
queue <pair<int,int>> Q;
vector <int> v+={{},{2,4},{1,3,5},{2,6},{1,5,7},{2,4,6,8},{3,5,9},{4,8},{5,7,9},{6,8}};
int A,ans=123456789;
char c;
int Find(int num){
for(int i=9;i>=1;i--){
if(num%10==9)return i;
num/=10;
}
}
int make(int num,int x,int i){
int i_num=num%int(pow(10,10-i))/pow(10,9-i);
return num-(9-i_num)*int(pow(10,9-x))+(9-i_num)*int(pow(10,9-i));
}
void bfs(){
Q.push({A,0});
while(!Q.empty()){
auto[num,dist]=Q.front();
Q.pop();
int x=Find(num);
for(int i:v[x]){
int a=make(num,x,i);
//if a: not visited
//으음....
}
}
}
int main(){
for(int i=0;i<9;i++){
scanf(" %c",&c);
if(c=='X')A=A*10+9;
else A=A*10+(int(c)-48);
}
bfs();
}
여기서 저 주석된 "으음..." 부분에 뭘 넣어야 할지 모르겠습니다.
123456789~987654321을 전부 배열에 넣고 방문 여부를 확인할 수는 없을 것 같아서 std::map이나 std::set을 사용하려고 했는데
[몇 번 만에 도착할 수 있다] + [퍼즐의 위치 정보] 이 두 개를 동시에 저장할 수 있는 방법은 없나요?
map이나 set을 pair로 만들어서 하고 싶은데 막상 그러자니 방문했다는 정보를 저장하는 방법을 모르겠네요.
도와주십시오!! 부탁드립니다.
제 경우는 퍼즐이 총 9개의 숫자로 이루어져 있는 걸 이용해서 9자리의 정수를 퍼즐의 위치 정보로 사용했습니다
Set[퍼즐의 위치 정보]=[몇 번 만에 도착할 수 있다]
감이 잡힌 것 같습니다. 감사합니다!
그건 map이잖아..저 방법이 상태 관리 중에서 제일 무난한거 같음