题目链接如下:
这道题真的让我很沮丧.....写了很久才AC就不提了,写完后看别人题解说水题....然后发现自己确实给自己找了很多麻烦来解这个题....给出一个骰子的top和face,明明只需要再确定一个面就能确定整个骰子的情况,我却傻乎乎费了很多劲把所有情况列出来了..真的太愚蠢了。脑子里都是雾....
我的愚蠢代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <utility>
#define debug
std::string maze;
int R, C, startR, startC, a, b;
int mat[10][10];
bool vis[10][10][24];
std::map<std::string, int> mp;
int du[] = {0, 0, -1, 1};
int dv[] = {-1, 1, 0, 0};
bool dfs(std::string ss, int r, int c, std::vector<std::pair<int, int>> path){
path.push_back({r, c});
if (path.size() != 1 && r == startR - 1 && c == startC - 1){
for (int i = 0; i < path.size(); ++i){
if (i % 9 == 0){
printf(" ");
}
printf("(%d,%d)%s%s", path[i].first + 1, path[i].second + 1, i == path.size() - 1 ? "" : ",", i % 9 == 8 || i == path.size() - 1 ? "\n" : "");
}
return true;
}
if (path.size() != 1){
vis[r][c][mp[ss]] = true;
}
for (int i = 0; i < 4; ++i){
int tempR = r + du[i];
int tempC = c + dv[i];
std::string tempS;
switch (i){
case 0: tempS = ss.substr(5, 1) + ss.substr(1, 1) + ss.substr(4, 1) + ss.substr(3, 1) + ss.substr(0, 1) + ss.substr(2, 1); break;
case 1: tempS = ss.substr(4, 1) + ss.substr(1, 1) + ss.substr(5, 1) + ss.substr(3, 1) + ss.substr(2, 1) + ss.substr(0, 1); break;
case 2: tempS = ss.substr(1, 1) + ss.substr(2, 1) + ss.substr(3, 1) + ss.substr(0, 1) + ss.substr(4, 1) + ss.substr(5, 1); break;
case 3: tempS = ss.substr(3, 1) + ss.substr(0, 1) + ss.substr(1, 1) + ss.substr(2, 1) + ss.substr(4, 1) + ss.substr(5, 1); break;
}
if (mp.find(tempS) == mp.end()){
mp[tempS] = mp.size();
}
if (tempR >= 0 && tempR <= R - 1 && tempC >= 0 && tempC <= C - 1 && !vis[tempR][tempC][mp[tempS]] && (mat[tempR][tempC] == -1 || mat[tempR][tempC] == ss[0] - '0')){
if(dfs(tempS, tempR, tempC, path)){
return true;
}
}
}
return false;
}
int main(){
#ifdef debug
freopen("0.txt", "r", stdin);
freopen("1.txt", "w", stdout);
#endif
while (std::cin >> maze && maze != "END"){
printf("%s\n", maze.c_str());
scanf("%d %d %d %d %d %d", &R, &C, &startR, &startC, &a, &b);
for (int i = 0; i < R; ++i){
for (int j = 0; j < C; ++j){
scanf("%d", mat[i] + j);
for (int k = 0; k < 24; ++k){
vis[i][j][k] = false;
}
}
}
int temp = a * 10 + b;
std::string start;
switch (temp){
case 12: start = "126543"; break;
case 13: start = "136425"; break;
case 15: start = "156234"; break;
case 14: start = "146352"; break;
case 21: start = "215634"; break;
case 24: start = "245316"; break;
case 26: start = "265143"; break;
case 23: start = "235461"; break;
case 32: start = "324516"; break;
case 36: start = "364125"; break;
case 35: start = "354261"; break;
case 31: start = "314652"; break;
case 41: start = "413625"; break;
case 42: start = "423561"; break;
case 46: start = "463152"; break;
case 45: start = "453216"; break;
case 51: start = "512643"; break;
case 53: start = "532416"; break;
case 56: start = "562134"; break;
case 54: start = "542361"; break;
case 62: start = "621534"; break;
case 63: start = "631452"; break;
case 65: start = "651243"; break;
case 64: start = "641325"; break;
}
std::vector<std::pair<int, int>> path;
if (!dfs(start, startR - 1, startC - 1, path)){
printf(" No Solution Possible\n");
}
}
#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}