1+
2+
3+ /*
4+ 5
5+ [".....","..E..",".WO..","....."]
6+ 3
7+ [".....","....O","....O","....."]
8+ 4
9+ ["..E.",".EOW","..W."]
10+ 1
11+ [".....","..O..","....."]
12+ 41
13+ ["E...W..WW",".E...O...","...WO...W","..OWW.O..",".W.WO.W.E","O..O.W...",".OO...W..","..EW.WEE."]
14+ 69
15+ ["W.W.WE..",".WWWEW..","EWW.WE.E","E.W.E.E.",".OEOO.EO","WE.WOE.W","WW...E..",".WEWO..O","E....E..",".OWE...."]
16+ 55
17+ ["..E..OEEO.","..O..EEEOE",".EE.WE..OW","..EEWE.W..","...EE.WEE.","W.E...WEE.","WW.WEEE.WW",".WW...WOOO"]
18+ 输出:
19+ []
20+ 预期:
21+ [[0,2],[2,2]]
22+ [[0,2],[0,3],[0,5],[0,6],[1,0],[1,8],[3,0],[3,8],[4,0],[6,0],[7,1],[7,4]]
23+ 55
24+ [[0,4],[1,0],[3,9],[4,9],[7,5]]
25+ */
26+
27+ class Solution
28+ {
29+ public:
30+ static constexpr int dirs[4 ][2 ] = {{-1 , 0 }, {0 , 1 }, {1 , 0 }, {0 , -1 }}; // up right down left
31+ string d[4 ] = {" up" , " right" , " down" , " left" };
32+
33+ bool isLegal (int i, int j, vector<string> &plate, int curdir)
34+ {
35+ curdir = curdir >= 2 ? curdir - 2 : curdir + 2 ; // change opposite direction
36+ if (plate[i][j] != ' .' )
37+ return false ;
38+ if (j == 0 && i > 0 && i < plate.size () - 1 && curdir == 1 )
39+ return true ;
40+ if (j == plate[0 ].size () - 1 && i>0 && i < plate.size () - 1 && curdir == 3 )
41+ return true ;
42+ if (i == 0 && j > 0 && j < plate[0 ].size () - 1 && curdir == 2 )
43+ return true ;
44+ if (i == plate.size () - 1 && j > 0 && j < plate[0 ].size () - 1 && curdir == 0 )
45+ return true ;
46+ return false ;
47+ }
48+
49+ void backtrack (int num, vector<string> &plate, vector<vector<int >> &res, int i, int j, int curdir)
50+ {
51+ // cout << "cur num: " << num << " " << i << " " << j << " curdir:" << curdir << " " << d[curdir] << endl;
52+
53+ if (num < 0 || j < 0 || j > plate[0 ].size () - 1 || i < 0 || i > plate.size () - 1 )
54+ return ;
55+ if (isLegal (i, j, plate, curdir))
56+ {
57+ // cout<<i<<" "<<j<<endl;
58+ vector<int > tmp = {i, j};
59+ res.emplace_back (tmp);
60+ }
61+ if (plate[i][j] == ' O' )
62+ {
63+ if (curdir == -1 )
64+ {
65+ for (int k = 0 ; k < 4 ; k++)
66+ {
67+ int new_i = i + dirs[k][0 ];
68+ int new_j = j + dirs[k][1 ];
69+ backtrack (num - 1 , plate, res, new_i, new_j, k);
70+ }
71+ }
72+ else
73+ {
74+ return ;
75+ }
76+ }
77+ else if (plate[i][j] == ' E' )
78+ {
79+ if (curdir == 0 )
80+ curdir = 4 ;
81+ // cout<<i<<" "<<j<<" E "<<i + dirs[curdir - 1][0]<<" "<< j + dirs[curdir - 1][0]<<endl;
82+ backtrack (num - 1 , plate, res, i + dirs[curdir - 1 ][0 ], j + dirs[curdir - 1 ][1 ], curdir - 1 );
83+ }
84+ else if (plate[i][j] == ' W' )
85+ {
86+ if (curdir == 3 )
87+ curdir = -1 ;
88+ backtrack (num - 1 , plate, res, i + dirs[curdir + 1 ][0 ], j + dirs[curdir + 1 ][1 ], curdir + 1 );
89+ }
90+ else if (plate[i][j] == ' .' )
91+ {
92+ // cout<<i<<" "<<j<<" . "<<i + dirs[curdir][0]<<" "<< j + dirs[curdir][1]<<endl;
93+ backtrack (num - 1 , plate, res, i + dirs[curdir][0 ], j + dirs[curdir][1 ], curdir);
94+ }
95+ }
96+
97+ static bool cmp (vector<int > a, vector<int > b)
98+ {
99+ if (a[0 ] == b[0 ])
100+ return a[1 ] < b[1 ];
101+ return a[0 ] < b[0 ];
102+ }
103+
104+ vector<vector<int >> ballGame (int num, vector<string> &plate)
105+ {
106+ vector<vector<int >> res;
107+ for (int i = 0 ; i < plate.size (); i++)
108+ {
109+ for (int j = 0 ; j < plate[0 ].size (); j++)
110+ {
111+ if (plate[i][j] == ' O' )
112+ {
113+ backtrack (num, plate, res, i, j, -1 );
114+ }
115+ }
116+ }
117+ // cout << res.size() << endl;
118+ sort (res.begin (), res.end (), cmp);
119+ auto it = unique (res.begin (), res.end ());
120+ res.erase (it, res.end ());
121+ return res;
122+ }
123+ };
124+
125+
126+ // // USE SET
127+
128+ class Solution
129+ {
130+ public:
131+ static constexpr int dirs[4 ][2 ] = {{-1 , 0 }, {0 , 1 }, {1 , 0 }, {0 , -1 }}; // up right down left
132+ set<int > st;
133+ bool isLegal (int i, int j, vector<string> &plate, int curdir)
134+ {
135+ curdir = curdir >= 2 ? curdir - 2 : curdir + 2 ; // change opposite direction
136+ if (j == 0 && i > 0 && i < plate.size () - 1 && curdir == 1 )
137+ return true ;
138+ if (j == plate[0 ].size () - 1 && i>0 &&i < plate.size () - 1 && curdir == 3 )
139+ return true ;
140+ if (i == 0 && j > 0 && j < plate[0 ].size () - 1 && curdir == 2 )
141+ return true ;
142+ if (i == plate.size () - 1 && j > 0 && j < plate[0 ].size () - 1 && curdir == 0 )
143+ return true ;
144+ return false ;
145+ }
146+
147+ void backtrack (int num, vector<string> &plate, vector<vector<int >> &res, int i, int j, int curdir)
148+ {
149+ if (num < 0 || j < 0 || j > plate[0 ].size () - 1 || i < 0 || i > plate.size () - 1 )
150+ return ;
151+ int m = plate[0 ].size ();
152+ if (plate[i][j]==' .' &&!st.count (i*m + j) && isLegal (i, j, plate, curdir))
153+ {
154+ vector<int > tmp = {i, j};
155+ res.emplace_back (tmp);
156+ st.insert (i*m + j);
157+ }
158+ if (plate[i][j] == ' O' )
159+ {
160+ if (curdir == -1 )
161+ {
162+ for (int k = 0 ; k < 4 ; k++)
163+ {
164+ int new_i = i + dirs[k][0 ];
165+ int new_j = j + dirs[k][1 ];
166+ backtrack (num - 1 , plate, res, new_i, new_j, k);
167+ }
168+ }
169+ else
170+ {
171+ return ;
172+ }
173+ }
174+ else if (plate[i][j] == ' E' )
175+ {
176+ if (curdir == 0 )
177+ curdir = 4 ;
178+ backtrack (num - 1 , plate, res, i + dirs[curdir - 1 ][0 ], j + dirs[curdir - 1 ][1 ], curdir - 1 );
179+ }
180+ else if (plate[i][j] == ' W' )
181+ {
182+ if (curdir == 3 )
183+ curdir = -1 ;
184+ backtrack (num - 1 , plate, res, i + dirs[curdir + 1 ][0 ], j + dirs[curdir + 1 ][1 ], curdir + 1 );
185+ }
186+ else if (plate[i][j] == ' .' )
187+ {
188+ backtrack (num - 1 , plate, res, i + dirs[curdir][0 ], j + dirs[curdir][1 ], curdir);
189+ }
190+ }
191+
192+ vector<vector<int >> ballGame (int num, vector<string> &plate)
193+ {
194+ vector<vector<int >> res;
195+ for (int i = 0 ; i < plate.size (); i++)
196+ {
197+ for (int j = 0 ; j < plate[0 ].size (); j++)
198+ {
199+ if (plate[i][j] == ' O' )
200+ {
201+ backtrack (num, plate, res, i, j, -1 );
202+ }
203+ }
204+ }
205+ return res;
206+ }
207+ };
0 commit comments