Untitled

 avatar
unknown
plain_text
a year ago
5.3 kB
2
Indexable
//The Knight
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#define MAX_QUEUE 1000000
template<typename T>
class Queue {
	T Q[MAX_QUEUE];
	int front;
	int rear;
public:
	Queue()
	{
		front = rear = -1;
	}
	bool isEmpty()
	{
		return front == -1;
	}
	bool isFull()
	{
		return front == 0 && rear == MAX_QUEUE - 1;
	}
	int size()
	{
		if (isEmpty())
			return 0;
		else return rear - front + 1;
	}
	void enQueue(T data)
	{
		if (!isFull())
		{
			if (front == -1) front++;
			rear++;
			Q[rear] = data;
		}
	}
	T deQueue()
	{
		T element;
		if (!isEmpty())
		{
			element = Q[front];
			if (front >= rear)
			{
				reset();
			}
			else front++;
			return element;
		}
	}
	void reset()
	{
		front = rear = -1;
	}
	T head()
	{
		return Q[front];
	}
	T tail()
	{
		return Q[rear];
	}
};
#define MAX 100
#define MAX_P 20
#define INF 10000000
int M, N, Point, step, min_step;
int map[MAX][MAX];
int visited[MAX][MAX];
int visited_point[MAX_P];
int adj[MAX_P][MAX_P];
int dr[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
int dc[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int R[MAX_P];
int C[MAX_P];
Queue<int> Q = Queue<int>();
void resetVisited()
{
	for(int i = 0; i < M; i++)
		for (int j = 0; j < N; j++)
		{
			visited[i][j] = 0;
		}
}

int BFS(int s, int e)
{
	int nr, nc, cr, cc;
	Q.reset();
	resetVisited();
	Q.enQueue(R[s]);
	Q.enQueue(C[s]);
	visited[R[s]][C[s]] = 1;
	while (!Q.isEmpty())
	{
		cr = Q.deQueue();
		cc = Q.deQueue();
		for (int i = 0; i < 8; i++)
		{
			nr = cr + dr[i];
			nc = cc + dc[i];
			if (nr >= 0 && nr < M && nc >= 0 && nc < N && visited[nr][nc] == 0)
			{
				Q.enQueue(nr);
				Q.enQueue(nc);
				visited[nr][nc] = visited[cr][cc] + 1;
				if (nr == R[e] && nc == C[e])
					return visited[nr][nc] - 1;
			}
		}
	}
	return -1;
}
void backtrack(int k, int prev)
{
	if (step >= min_step)
		return;
	if (k == Point)
	{
		min_step = step < min_step ? step : min_step;
		return;
	}
	for (int i = 1; i < Point; i++)
	{
		if (visited_point[i] == 0)
		{
			visited_point[i] = 1;
			step += adj[prev][i];
			backtrack(k + 1, i);
			step -= adj[i][prev];
			visited_point[i] = 0;
		}
	}
}
int main()
{
	int tc, T;
	freopen("input.txt", "r", stdin);
	cin >> T;
	for (tc = 1; tc <= T; tc++)
	{
		cin >> M >> N;
		Point = 1;
		//read input
		for (int i = 0; i < M; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cin >> map[i][j];
				if (map[i][j] == 3)
				{
					R[0] = i;
					C[0] = j;
				}
				if (map[i][j] == 1)
				{
					R[Point] = i;
					C[Point] = j;
					Point++;
				}
			}
		}
		//adjacent matrix
		for (int i = 0; i < Point; i++)
		{
			visited_point[i] = 0;
			for (int j = i; j < Point; j++)
			{
				if (j == i)
					adj[i][j] = 0;
				else
				{
					adj[i][j] = adj[j][i] = BFS(i, j);
				}
			}
		}
		step = 0; min_step = INF;
		backtrack(1, 0);
		cout << "Case #" << tc << endl;
		cout << min_step << endl;
	}
	return 0;
}



// The crazy King
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#define MAX_QUEUE 1000000
template<typename T>
class Queue {
	T Q[MAX_QUEUE];
	int front;
	int rear;
public:
	Queue()
	{
		front = rear = -1;
	}
	bool isEmpty()
	{
		return front == -1;
	}
	bool isFull()
	{
		return front == 0 && rear == MAX_QUEUE - 1;
	}
	int size()
	{
		if (isEmpty())
			return 0;
		else return rear - front + 1;
	}
	void enQueue(T data)
	{
		if (!isFull())
		{
			if (front == -1) front++;
			rear++;
			Q[rear] = data;
		}
	}
	T deQueue()
	{
		T element;
		if (!isEmpty())
		{
			element = Q[front];
			if (front >= rear)
			{
				reset();
			}
			else front++;
			return element;
		}
	}
	void reset()
	{
		front = rear = -1;
	}
	T head()
	{
		return Q[front];
	}
	T tail()
	{
		return Q[rear];
	}
};
using namespace std;
#define MAX 105
int M, N, sr, sc, er, ec, ans;
char map[MAX][MAX];
int visited[MAX][MAX];
int drH[8] = { -1, -2, -2, -1, 1, 2, 2, 1 };
int dcH[8] = { -2, -1, 1, 2, 2, 1, -1, -2 };
int drK[8] = { 0, 0, 1, -1, -1, -1, 1, 1 };
int dcK[8] = { 1, -1, 0, 0, -1, 1, -1, 1 };
Queue<int> Q = Queue<int>();
void marking(int r, int c)
{
	int nr, nc;
	visited[r][c] = -1;
	for (int i = 0; i < 8; i++)
	{
		nr = r + drH[i];
		nc = c + dcH[i];
		if (nr >= 0 && nr < M && nc >= 0 && nc < N)
			visited[nr][nc] = -1;
	}
}
int main()
{
	int tc, T, cr, cc, nr, nc;
	freopen("input.txt", "r", stdin);
	cin >> T;
	for (tc = 1; tc <= T; tc++)
	{
		cin >> M >> N;
		for (int i = 0; i < M; i++)
			for (int j = 0; j < N; j++)
				visited[i][j] = 0;
		for (int i = 0; i < M; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cin >> map[i][j];
				if (map[i][j] == 'A')
				{
					sr = i;
					sc = j;
				}
				else if (map[i][j] == 'B')
				{
					er = i;
					ec = j;
				}
				else if (map[i][j] == 'Z')
					marking(i, j);
			}
		}
		ans = -1;
		Q.reset();
		Q.enQueue(sr);
		Q.enQueue(sc);
		visited[sr][sc] = 1; 
		visited[er][ec] = 0;
		while (!Q.isEmpty())
		{
			cr = Q.deQueue();
			cc = Q.deQueue();
			for (int i = 0; i < 8; i++)
			{
				nr = cr + drK[i];
				nc = cc + dcK[i];
				if (nr >= 0 && nr < M && nc >= 0 && nc < N && visited[nr][nc] == 0)
				{
					Q.enQueue(nr);
					Q.enQueue(nc);
					visited[nr][nc] = visited[cr][cc] + 1;

					if (nr == er && nc == ec)
					{
						ans = visited[nr][nc] - 1;
						goto end;
					}
				}
			}
		}
	end:
		cout << ans << endl;
	}
	return 0;
}
Leave a Comment