Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool mouseEscapeEx(char[][] board, int steps)
- {
- var watch = System.Diagnostics.Stopwatch.StartNew();
- var R = board.Length;
- var C = board[0].Length;
- var startFromR = board.Select((x, i) => x.Any(e => e == '&') ? i : 0)
- .Max();
- var startFromC = board[startFromR].Select((x, i) => x == '&' ? i : 0)
- .Max();
- var cookieR = board.Select((x, i) => x.Any(e => e == 'O') ? i : 0)
- .Max();
- var cookieC = board[cookieR].Select((x, i) => x == 'O' ? i : 0)
- .Max();
- if(startFromR == cookieR & startFromC == cookieC) return false;
- int fR = cookieR;
- int fC = cookieC;
- var Q = new Queue < int[] > ();
- bool reached = false;
- var visited = new int[R][];
- for(int k = 0; k < R; k++) visited[k] = new int[C];
- var dR = new []
- {
- -1
- , 1
- , 0
- , 0
- };
- var dC = new []
- {
- 0
- , 0
- , 1
- , -1
- };
- visited[startFromR][startFromC] = 1;
- Q.Enqueue(new []
- {
- startFromR
- , startFromC
- , steps
- , 0
- });
- while(Q.Count > 0)
- {
- var RQ = Q.Dequeue();
- if(RQ[2] > 0)
- for(int i = 0; i < 4; i++)
- {
- int rr = RQ[0] + dR[i];
- int cc = RQ[1] + dC[i];
- if(rr < 0 || cc < 0) continue;
- if(rr >= R || cc >= C) continue;
- if(board[rr][cc] == 'X') continue;
- if(visited[rr][cc] != 0) continue;
- if(board[rr][cc] == 'O'){
- reached = true;
- break;
- }
- var Qs = board[rr][cc] == 'C' ? new []
- {
- rr
- , cc
- , steps
- , 1
- } : new []
- {
- rr
- , cc
- , RQ[2] - 1
- , 0
- };
- if(visited[rr][cc] == 0)
- {
- visited[rr][cc] = Qs.Last();
- Q.Enqueue(Qs);
- }
- }
- }
- watch.Stop();
- Console.Write($"Time: {watch.Elapsed.TotalMilliseconds} ms");
- return reached;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement