/* * code reference: * http://blogs.msdn.com/b/mattwar/archive/2005/02/11/371274.aspx * * julia's comment: * 1. try to identify the cycle detection / back tracking code * 2. Try to understand code. */ public static bool FindCheese(IMouse mouse, int rows, int cols) { Cell[,] grid = new Cell[rows, cols]; int r = 0; int c = 0; // set terminal, so we don't backtrack past the origin grid[r, c].prev = 4; while (!mouse.IsCheeseHere()) { byte d = grid[r, c].next; if (d < 4) { // increment so we know what to try next grid[r, c].next++; // determine next relative position int nr = (r + dr[d] + rows) % rows; int nc = (c + dc[d] + cols) % cols; // only try to move to cells we have not already visited if (grid[nr, nc].next == 0 && mouse.Move((Direction)d)) { r = nr; c = nc; // remember how to get back grid[r, c].prev = (byte)((d + 2) % 4); } } else { // backtrack d = grid[r, c].prev; if (d == 4) { return(false); } mouse.Move((Direction)d); r = (r + dr[d] + rows) % rows; c = (c + dc[d] + cols) % cols; } } return(true); }
/* * code reference: * http://blogs.msdn.com/b/mattwar/archive/2005/02/11/371274.aspx * * julia's comment: * 1. try to identify the cycle detection / back tracking code * 2. Try to understand code. */ public static bool FindCheese(IMouse mouse, int rows, int cols) { Cell[,] grid = new Cell[rows, cols]; int r = 0; int c = 0; // set terminal, so we don't backtrack past the origin grid[r, c].prev = 4; while (!mouse.IsCheeseHere()) { byte d = grid[r,c].next; if (d < 4) { // increment so we know what to try next grid[r,c].next++; // determine next relative position int nr = (r + dr[d] + rows) % rows; int nc = (c + dc[d] + cols) % cols; // only try to move to cells we have not already visited if (grid[nr,nc].next == 0 && mouse.Move((Direction)d)) { r = nr; c = nc; // remember how to get back grid[r, c].prev = (byte)((d + 2) % 4); } } else { // backtrack d = grid[r, c].prev; if (d == 4) return false; mouse.Move((Direction)d); r = (r + dr[d] + rows) % rows; c = (c + dc[d] + cols) % cols; } } return true; }