高级农民
- 积分
- 2169
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-9-3
- 最后登录
- 1970-1-1
|
那这样的话就是bfs了, 当y == 0 的时候可以向右 或者向下, 当y == col-1的时候可以向左或者向下,
当0<y<col的时候,保持原有的方向,但是当修复了坏机器,这时可以选择转向或者继续前进,
我代码的问题是我没有找到好的保存状态的办法,我既要保存位置,还有已经修复的机器,还有前进的方向,
我自己都觉得写的代码很恶
public List<int[]> ShortestPathFixMachine(int row, int col, List<int[]> machines)
{
HashSet<int> machineSet = new HashSet<int>();
foreach (int[] a in machines)
{
machineSet.Add(a[0] * col + a[1]);
}
int n = machines.Count;
Queue<Tuple<int, string,int>> queue = new Queue<Tuple<int, string,int>>();
HashSet<Tuple<int, string,int>> visited = new HashSet<Tuple<int, string,int>>();
if (machineSet.Contains(0))
{
Tuple<int, string,int> t = new Tuple<int, string,int>(0, "0",1);
queue.Enqueue(t);
visited.Add(t);
}
else
{
Tuple<int, string,int> t = new Tuple<int, string,int>(0, "",1);
queue.Enqueue(t);
visited.Add(t);
}
while (queue.Count > 0)
{
Tuple<int, string,int> cur = queue.Dequeue();
string[] arr = cur.Item2.Split(',');
if (arr.Length == n)
{
List<int[]> res = new List<int[]>();
foreach (string s in arr)
{
int pos = Int32.Parse(s);
res.Add(new int[]{ pos / col, pos % col});
}
return res;
}
HashSet<string> curState = new HashSet<string>(arr);
int x = cur.Item1 / col, y = cur.Item1 % col;
string state = cur.Item2;
if (machineSet.Contains(cur.Item1) && !curState.Contains(cur.Item1.ToString()))
{
if (state.Length == 0)
state = cur.Item1.ToString();
else
state += "," + cur.Item1;
}
if (y == 0)
{
//move right
Tuple<int, string,int> tright = new Tuple<int, string,int>(cur.Item1 + 1, state,1);
if (!visited.Contains(tright))
queue.Enqueue(tright);
if ((x + 1) * col + y >= row * col)
continue;
//move down
Tuple<int, string,int> tdown = new Tuple<int, string,int>((x + 1) * col + y, state,1);
if (!visited.Contains(tdown))
{
queue.Enqueue(tdown);
visited.Add(tdown);
}
}
else if (y == col - 1)
{
//move left
Tuple<int, string,int> tleft = new Tuple<int, string,int>(cur.Item1 - 1, state,-1);
if (!visited.Contains(tleft))
queue.Enqueue(tleft);
if ((x + 1) * col + y >= row * col)
continue;
//move down
Tuple<int, string,int> tdown = new Tuple<int, string,int>((x + 1) * col + y, state,-1);
if (!visited.Contains(tdown))
{
queue.Enqueue(tdown);
visited.Add(tdown);
}
}
else
{
//either left or right
Tuple<int, string,int> tmove = new Tuple<int, string,int>(cur.Item1 + cur.Item3, state, cur.Item3);
if (!visited.Contains(tmove))
{
queue.Enqueue(tmove);
visited.Add(tmove);
}
//state change, can change direction
if (state != cur.Item2)
{
Tuple<int, string, int> tmove2 = new Tuple<int, string, int>(cur.Item1 - cur.Item3, state, -cur.Item3);
if (!visited.Contains(tmove2))
{
queue.Enqueue(tmove2);
visited.Add(tmove2);
}
}
}
}
return null;
}
|
|