그래프에서 가장 긴 경로를 찾는데 내 솔루션에 하나의 문제점이 있습니다. 내 프로그램은 정점이 서로 가까울 때 매우 느리게 작동합니다. 여기 제 코드가 도와주세요. 찾는 경로그래프에서 가장 긴 경로를 찾는 방법
대한테스트 클래스
public class GraphTest : MonoBehaviour {
// Use this for initialization
void Start() {
const int w = 5;
const int h = 4;
int[,] data = new int[h,w]{
{0,0,0,1,0},
{0,0,0,1,0},
{0,0,1,1,0},
{0,0,0,0,0}};
Map map = new Map(data,w,h);
List<Node> longest = map.longestPath();
Debug.Log("LONGEST " + longest.Count);
//INFO this doing for printing array with steps
int c = longest.Count-1;
foreach(Node n in longest)
data[n.r,n.c] = c--;
string st = "";
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w; j++)
{
st += data[i,j] + ",";
}
st += "\n";
}
Debug.Log(st);
}
}
노드 클래스
public class Node
{
public int r,c;
public int data;
public Node[] neighbors;
public Node(int r, int c, int data)
{
this.r = r;
this.c = c;
this.data = data;
neighbors = new Node[8];
}
}
지도 클래스
public class Map { public static int[] xDir = {1,1,1,0,-1,-1,-1,0}; public static int[] yDir = {-1,0,1,1,1,0,-1,-1}; public Node[,] map; public int[,] mapData; private int width,height; private int[,] marks; public Map(int[,] mapData,int width,int height) { this.mapData = mapData; this.width = width; this.height = height; createNodes(); initNeighbors(); } //INFO create nodes private void createNodes() { map = new Node[height,width]; for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++) { map[i,j] = new Node(i,j,mapData[i,j]); } } } //INFO assign neighbor nodes private void initNeighbors() { for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++) { for(int k = 0; k < 8; k++) { if(inRange(i+yDir[k],j+xDir[k])) { map[i,j].neighbors[k] = map[i+yDir[k],j+xDir[k]]; } } } } } private bool inRange(int r, int c) { return r < height && r >= 0 && c < width && c >= 0; } public List<Node> longestPath() { marks = new int[height,width]; List<Node> nodes = new List<Node>(); int c = dfs(map[0,0],nodes); //INFO Iterasions count Debug.Log("COUNT " + c); return nodes; } private int dfs(Node node, List<Node> nodes) { int i = 1; List<Node> longest = new List<Node>(); List<Node> list = null; marks[node.r,node.c] = 1; for(int n = 0; n < 8; n++) { //INFO if the neighbor node is not null and same type with parent node do dfs for neighbor node if(node.neighbors[n] != null && marks[node.neighbors[n].r,node.neighbors[n].c] == 0 && node.neighbors[n].data == node.data) { list = new List<Node>(); i += dfs(node.neighbors[n],list); //INFO if the found nodes count is more than previous nodes count set new nodes to best nodes if(list.Count > longest.Count) longest = list; } } marks[node.r,node.c] = 0; longest.Add(node); nodes.AddRange(longest); return i; } }
나는 무엇을하려고하는지 궁금하다. 좀 더 정교하게 만들 수 있습니까? 이거 게임인가요? – Postlagerkarte