习题6-12(uva-810)

dfs

#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>


#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int maxn = 11, maxm = 7;
int matrix[maxn][maxn],vis[maxn][maxn][maxm][maxm],n,m,x,y,isfind ;
vector<pair<int, int> > path,tpath;
//(( 顶,正),左)
map<pair<int, int>, int> mmp;

const int cDir[4][4] = { {3,5,1,6},{6,1,5,3},{1,2,3,4},{4,3,2,1} };
const int Dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };

vector<int> MoveOnce(vector<int>& a, int dir) {
	vector<int> ret = a;
	int base = a[cDir[dir][0]];
	for (int i = 1;i<4;i++)
	{
		ret[cDir[dir][i - 1]] = ret[cDir[dir][i]];
	}
	ret[cDir[dir][3]] = base;
	return ret;
}
void findID(vector<int> a) {
	if (mmp.count(make_pair(a[3], a[5]))) return;
	mmp[make_pair(a[3], a[5])] = a[2];

	for (int i = 0; i < 4; i++) {
		findID(MoveOnce(a,i));
	}
}

pair<int, int> TurnOnce(int up, int face,int dir) {
	if (dir == 0) {
		return make_pair(face, 7 - up);
	}
	else if (dir == 1) {
		return make_pair(7 - face, up);
	}
	else if (dir == 2) {
		int left = mmp[make_pair(up, face)];
		return make_pair(7 - left, face);
	}
	int left = mmp[make_pair(up, face)];
	return make_pair(left, face);
}
bool dfs(int curx, int cury, int up, int face) {
	if (isfind) return true;

	if (!tpath.empty() && x == curx && y == cury) {
		cout << "  ";
		for (int i = 0; i < tpath.size(); i++) {
			if (i && i % 9 == 0) cout << endl << "  ";
			cout << "(" << tpath[i].first << "," << tpath[i].second << ")"<<",";
		}
		cout << "(" << x << "," << y << ")" << endl;
		isfind = 1;
		return true;
	}
	if (vis[curx][cury][up][face]) return false;

	tpath.emplace_back(make_pair(curx, cury));
	vis[curx][cury][up][face] = 1;

	for (int i = 0; i < 4; i++) {
		int nx = curx + Dir[i][0];
		int ny = cury + Dir[i][1];
		if (isfind) return true;
		if (matrix[nx][ny] == -1 || matrix[nx][ny] == up) {
			pair<int, int> t = TurnOnce(up, face, i);
			if (dfs(nx, ny, t.first, t.second)) return true;
		}
	}
	tpath.pop_back();
	vis[curx][cury][up][face] = 0;
	return false;
}

int main()
{
	vector<int> arr = { 0,1,2,6,5,4,3 };
	findID(arr);

	string temp;
	int up, face;
	while (cin >> temp && temp != "END") {
		path.clear(); tpath.clear();
		memset(matrix, 0, sizeof(matrix));
		memset(vis, 0, sizeof(vis));
		isfind = 0;
		cin >> n >> m >> x >> y >> up >> face;

		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++)
				cin >> matrix[i][j];
		}

		cout << temp << endl;
		if (!dfs(x, y, up, face)) cout << "  No Solution Possible" << endl;
	}
	return 0;
}

bfs

#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>


#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int maxn = 11, maxm = 7;
int matrix[maxn][maxn],vis[maxn][maxn][maxm][maxm],n,m,x,y,isfind ;
vector<pair<int, int> > path,tpath;
//(( 顶,上),左)
map<pair<int, int>, int> mmp;
struct Node {
	void setValue(int a = 0, int b = 0, int c = 0, int d = 0,int e = 0)
	{
		x = a, y = b, up = c, face = d, before = e;
	}
	int x, y, up, face,before;
};

Node nodes[10000];
int cnt = 1;

const int cDir[4][4] = { {3,5,1,6},{6,1,5,3},{1,2,3,4},{4,3,2,1} };
const int Dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };

vector<int> MoveOnce(vector<int>& a, int dir) {
	vector<int> ret = a;
	int base = a[cDir[dir][0]];
	for (int i = 1;i<4;i++)
	{
		ret[cDir[dir][i - 1]] = ret[cDir[dir][i]];
	}
	ret[cDir[dir][3]] = base;
	return ret;
}
void findID(vector<int> a) {
	if (mmp.count(make_pair(a[3], a[5]))) return;
	mmp[make_pair(a[3], a[5])] = a[2];

	for (int i = 0; i < 4; i++) {
		findID(MoveOnce(a,i));
	}
}

pair<int, int> TurnOnce(int up, int face,int dir) {
	if (dir == 0) {
		return make_pair(face, 7 - up);
	}
	else if (dir == 1) {
		return make_pair(7 - face, up);
	}
	else if (dir == 2) {
		int left = mmp[make_pair(up, face)];
		return make_pair(7 - left, face);
	}
	int left = mmp[make_pair(up, face)];
	return make_pair(left, face);
}
bool dfs(int curx, int cury, int up, int face) {
	if (isfind) return true;

	if (!tpath.empty() && x == curx && y == cury) {
		cout << "  ";
		for (int i = 0; i < tpath.size(); i++) {
			if (i && i % 9 == 0) cout << endl << "  ";
			cout << "(" << tpath[i].first << "," << tpath[i].second << ")"<<",";
		}
		cout << "(" << x << "," << y << ")" << endl;
		isfind = 1;
		return true;
	}
	if (vis[curx][cury][up][face]) return false;

	tpath.emplace_back(make_pair(curx, cury));
	vis[curx][cury][up][face] = 1;

	for (int i = 0; i < 4; i++) {
		int nx = curx + Dir[i][0];
		int ny = cury + Dir[i][1];
		if (isfind) return true;
		if (matrix[nx][ny] == -1 || matrix[nx][ny] == up) {
			pair<int, int> t = TurnOnce(up, face, i);
			if (dfs(nx, ny, t.first, t.second)) return true;
		}
	}
	tpath.pop_back();
	vis[curx][cury][up][face] = 0;
	return false;
}

bool bfs(int curx, int cury, int up, int face) {

	int res = 0,head = 1, tail = 1;
	nodes[tail++].setValue(curx, cury, up, face);

	while (head < tail) {
		if(res) break;
		int id = head;
		int a = nodes[id].x, b = nodes[id].y, c = nodes[id].up, d = nodes[id].face;
		//cout << "(" << a << "," << b << ")" << ",";
		vis[a][b][c][d] = 1;
		for (int i = 0; i < 4; i++) {
			int nx = a + Dir[i][0];
			int ny = b + Dir[i][1];
			
			if (matrix[nx][ny] == -1 || matrix[nx][ny] == c)
			{
				pair<int, int> t = TurnOnce(c, d, i);
				if (nx == x && ny == y) {
					res = tail;
					nodes[tail++].setValue(nx, ny, t.first, t.second, id);
					break;
				}
				if (vis[nx][ny][t.first][t.second]) continue;
				nodes[tail++].setValue(nx, ny, t.first, t.second, id);
				vis[nx][ny][t.first][t.second] = 1;
			}
		}
		head++;
	}
	if (res == 0) return false;

	while (nodes[res].before) {
		path.push_back(make_pair(nodes[res].x, nodes[res].y));
		res = nodes[res].before;
	}
	path.push_back(make_pair(x, y));
	reverse(path.begin(), path.end());

	cout << "  ";
	for (int i = 0; i < path.size() - 1; i++) {
		if (i && i % 9 == 0) cout << endl << "  ";
		cout << "(" << path[i].first << "," << path[i].second << ")" << ",";
	}
	cout << "(" << x << "," << y << ")" << endl;
	return true;
}
int main()
{
	vector<int> arr = { 0,1,2,6,5,4,3 };
	findID(arr);

	string temp;
	int up, face;
	while (cin >> temp && temp != "END") {
		path.clear(); tpath.clear();
		memset(matrix, 0, sizeof(matrix));
		memset(vis, 0, sizeof(vis));
		memset(nodes, 0, sizeof(0));
		isfind = 0;
		cnt = 1;
		cin >> n >> m >> x >> y >> up >> face;

		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++)
				cin >> matrix[i][j];
		}

		cout << temp << endl;
		//if (!dfs(x, y, up, face)) cout << "  No Solution Possible" << endl;
		if(!bfs(x, y, up, face))cout << "  No Solution Possible" << endl;	
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值