-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2383.cpp
More file actions
120 lines (99 loc) Β· 2.51 KB
/
Copy path2383.cpp
File metadata and controls
120 lines (99 loc) Β· 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <vector>
#include <math.h>
#include <queue>
using namespace std;
int n;
int map[10][10];
int p_map[10][10]; //νμ¬ κ³λ¨μ λͺλͺ
μ μ¬λμ΄ μλμ§
int p_loc[10]; //μ¬λλ³λ‘ μ΄λ€ κ³λ¨μ λ΄λ €κ°μ§
int ptos[10]; //μ¬λλ³λ‘ κ³λ¨μ κ°κΈ°μν μ΅μ μκ°
int ans = 987654321;
vector<pair<int, int> > person;
vector<pair<int, int> > stair;
int p_size;
void init_(){
person.clear();
stair.clear();
ans = 987654321;
}
int cal(){
int time = 0;
int finish = 0;
queue<int> q[2];
for(int i=0; i<p_size; i++)
ptos[i] = abs(person[i].first - stair[p_loc[i]].first) + abs(person[i].second - stair[p_loc[i]].second);
while(true){
if(finish == p_size)
break;
//λΆλΉ ν΄λΉ κ³λ¨μ μ¬λ λ°°μΉ
for(int i=0; i<p_size; i++){
if(ptos[i] < 0)
continue;
if(ptos[i] == 0){
if(q[p_loc[i]].size() < 3){
q[p_loc[i]].push(map[stair[p_loc[i]].first][stair[p_loc[i]].second]);
ptos[i] = -1;
}
continue;
}
ptos[i] -= 1;
}
//λ°°μΉ ν κ³λ¨λ΄λ €κ°κΈ°
for(int i=0; i<2; i++){
int next = q[i].size();
for(int j=0; j<next; j++){
int temp = q[i].front();
q[i].pop();
if(temp > 1)
q[i].push(temp-1);
else
finish++;
}
}
time++;
}
return time + 1;
}
void dfs(int cnt){
if(cnt == p_size){
ans = min(ans,cal());
return;
}
for(int i=0; i<2; i++){
p_loc[cnt] = i;
dfs(cnt+1);
}
}
// void dfs(int cnt){
// if(cnt == p_size){
// ans = min(ans, cal());
// return;
// }
// p_loc[cnt] = 0;
// dfs(cnt+1);
// p_loc[cnt] = 1;
// dfs(cnt+1);
// return;
// }
int main(){
int test_case;
cin>>test_case;
for(int T=1; T<=test_case; T++){
cin>>n;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin>>map[i][j];
if(map[i][j] == 1)
person.push_back(make_pair(i,j));
if(map[i][j] > 1)
stair.push_back(make_pair(i,j));
}
}
p_size = person.size();
dfs(0);
cout<<"#"<<T<<" "<<ans<<endl;
init_();
}
return 0;
}