Mình đang cần làm 1 bài toán đong nước kiểu kiểu 1 bình n lít và 1 bình m lít cần đong ra k lít ấy. Mình đã viết xong thuật toán và đã vét cạn được tất cả các đỉnh ra rồi nhưng không biết cách truy vấn ngược lại để in ra đường đi. Mình biết là cần làm 1 hàm father(v) <- u nhưng không biết code như thế nào. Mọi người ai biết vô chỉ mình với. Code mình đây ạ. Mọi người xem phần BFS.cs hộ mình nhé. Ai rành winform thì làm giùm mình luôn cái bài luôn cũng được. Mình xin chân thành cảm ơn. Ai có thể giúp đỡ có thể mail cho mình [url=mailto:nguyenpthai1995@gmail.com]nguyenpthai1995@gmail.com[/url]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BaiToanDongNuoc
{
class BFS
{
public bool isFinal = false;
public class item
{
public int x
{
get { return x; }
set { x = value; }
}
public int y
{
get { return y; }
set { y = value; }
}
public item(int x, int y)
{
this.x = x;
this.y = y;
}
}
Queue<item> q = new Queue<item>();
List<item> Free = new List<item>();
public void giaiThuatBFS(int _x, int _y, int _z)
{
q.Clear();
Free.Clear();
q.Enqueue(new item(0,0));
while (q.Count > 0)
{
item u = q.Dequeue();
Free.Add(u);
if(u.x==_z || u.y == _z)
{
isFinal = true;
break;
}
// đổ vào
if (u.x != _x)
checkFree(new item(_x,u.y));
if (u.y != _y)
checkFree(new item(u.x,_y));
// đổ ra
if (u.x > 0)
checkFree(new item(0,u.y));
if (u.y > 0)
checkFree(new item(u.x, 0));
//đổ 1 -> 2
if (u.x > 0)
{
var v1 = new item(0, 0);
v1.y = u.y + u.x;
if (v1.y > _y)
{
v1.x = v1.y - _y;
v1.y = _y;
}
checkFree(v1);
}
//đổ 2->1
if (u.y > 0)
{
var v1 = new item(0, 0);
v1.x = u.x + u.y;
if (v1.x > _x)
{
v1.y = v1.x - _x;
v1.x = _x;
}
checkFree(v1);
}
}
}
public void checkFree(item v)
{
if (Free.Count(i => i.x == v.x && i.y == v.y) == 0)
{
q.Enqueue(v);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BaiToanDongNuoc
{
class BFS
{
public bool isFinal = false;
public class item
{
public int x
{
get { return x; }
set { x = value; }
}
public int y
{
get { return y; }
set { y = value; }
}
public item(int x, int y)
{
this.x = x;
this.y = y;
}
}
Queue<item> q = new Queue<item>();
List<item> Free = new List<item>();
public void giaiThuatBFS(int _x, int _y, int _z)
{
q.Clear();
Free.Clear();
q.Enqueue(new item(0,0));
while (q.Count > 0)
{
item u = q.Dequeue();
Free.Add(u);
if(u.x==_z || u.y == _z)
{
isFinal = true;
break;
}
// đổ vào
if (u.x != _x)
checkFree(new item(_x,u.y));
if (u.y != _y)
checkFree(new item(u.x,_y));
// đổ ra
if (u.x > 0)
checkFree(new item(0,u.y));
if (u.y > 0)
checkFree(new item(u.x, 0));
//đổ 1 -> 2
if (u.x > 0)
{
var v1 = new item(0, 0);
v1.y = u.y + u.x;
if (v1.y > _y)
{
v1.x = v1.y - _y;
v1.y = _y;
}
checkFree(v1);
}
//đổ 2->1
if (u.y > 0)
{
var v1 = new item(0, 0);
v1.x = u.x + u.y;
if (v1.x > _x)
{
v1.y = v1.x - _x;
v1.x = _x;
}
checkFree(v1);
}
}
}
public void checkFree(item v)
{
if (Free.Count(i => i.x == v.x && i.y == v.y) == 0)
{
q.Enqueue(v);
}
}
}
}