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;
}