蹲一个有空闲时间的大佬来帮我写写更简单的解法
本人代码高达388行,不好意思作为标程
#include <bits/stdc++.h>
using namespace std;
const int N = 10,INF = 2147483647;
char c[7][N];
int minn = INF,n,mvT[3] = {-1,0,1},mvDN[6] = {1,2,3,4,5,6},vv[N][7];
int f(int x){
if (x < 0) x = 0;
return x;
}
void dfs(int x1,int x2,int y,int miss){
if (x1 > x2) return;
if (miss >= minn) return;
if (y > n){
minn = miss;
return ;
}
memset(vv[y],0,sizeof(vv[y]));
int nty = y + 1;
int t = 0;
for (int i = 1;i <= 6;i++) if (c[i][y] != 'N') t++;
for (int i = 1;i <= 6;i++){
vv[y][i] = y;
if (i == x1 || i == x2) continue;
while (c[i][vv[y][i]] == 'H') c[i][vv[y][i]++] = 'N';
}
if (c[x1][y] == 'T' && c[x2][y] == 'T'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 3;i++){
int ntx1 = x1 + mvT[i];
for (int j = 0;j < 3;j++){
int ntx2 = x2 + mvT[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6 || x1 > x2) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'T' && c[x2][y] == 'D'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 3;i++){
int ntx1 = x1 + mvT[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'T' && c[x2][y] == 'F'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 3;i++){
int ntx1 = x1 + mvT[i];
int ntx2 = x2;
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'T' && c[x2][y] == 'N'){
int Miss = miss + f(t - 1);
for (int i = 0;i < 3;i++){
int ntx1 = x1 + mvT[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'T' && c[x2][y] == 'H'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 3;i++){
int ntx1 = x1 + mvT[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x2][nty] == 'H' && ntx2 != x2){
int v = y;
while (c[x2][v] == 'H') c[x2][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x2][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'D' && c[x2][y] == 'T'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 3;j++){
int ntx2 = x2 + mvT[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'D' && c[x2][y] == 'D'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'D' && c[x2][y] == 'F'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
int ntx2 = x2;
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'D' && c[x2][y] == 'N'){
int Miss = miss + f(t - 1);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'D' && c[x2][y] == 'H'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x2][nty] == 'H' && ntx2 != x2){
int v = y;
while (c[x2][v] == 'H') c[x2][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x2][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'F' && c[x2][y] == 'T'){
int Miss = miss + f(t - 2);
int ntx1 = x1;
for (int i = 0;i < 3;i++){
int ntx2 = x2 + mvT[i];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'F' && c[x2][y] == 'D'){
int Miss = miss + f(t - 2);
int ntx1 = x1;
for (int i = 0;i < 6;i++){
int ntx2 = mvDN[i];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'F' && c[x2][y] == 'F'){
int Miss = miss + f(t - 2);
int ntx1 = x1;
int ntx2 = x2;
dfs(ntx1,ntx2,nty,Miss);
}
if (c[x1][y] == 'F' && c[x2][y] == 'N'){
int Miss = miss + f(t - 1);
int ntx1 = x1;
for (int i = 0;i < 6;i++){
int ntx2 = mvDN[i];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'F' && c[x2][y] == 'H'){
int Miss = miss + f(t - 2);
int ntx1 = x1;
for (int i = 0;i < 6;i++){
int ntx2 = mvDN[i];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x2][nty] == 'H' && ntx2 != x2){
int v = y;
while (c[x2][v] == 'H') c[x2][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x2][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'N' && c[x2][y] == 'T'){
int Miss = miss + f(t - 1);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 3;j++){
int ntx2 = x2 + mvT[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'N' && c[x2][y] == 'D'){
int Miss = miss + f(t - 1);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'N' && c[x2][y] == 'F'){
int Miss = miss + f(t - 1);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
int ntx2 = x2;
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'N' && c[x2][y] == 'N'){
int Miss = miss + f(t);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'N' && c[x2][y] == 'H'){
int Miss = miss + f(t - 1);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x2][nty] == 'H' && ntx2 != x2){
int v = y;
while (c[x2][v] == 'H') c[x2][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x2][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'H' && c[x2][y] == 'T'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 3;j++){
int ntx2 = x2 + mvT[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x1][nty] == 'H' && ntx1 != x1){
int v = y;
while (c[x1][v] == 'H') c[x1][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x1][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'H' && c[x2][y] == 'D'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x1][nty] == 'H' && ntx1 != x1){
int v = y;
while (c[x1][v] == 'H') c[x1][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x1][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'H' && c[x2][y] == 'F'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
int ntx2 = x2;
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x1][nty] == 'H' && ntx1 != x1){
int v = y;
while (c[x1][v] == 'H') c[x1][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x1][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
if (c[x1][y] == 'H' && c[x2][y] == 'N'){
int Miss = miss + f(t - 1);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
if (c[x1][nty] == 'H' && ntx1 != x1){
int v = y;
while (c[x1][v] == 'H') c[x1][v++] = 'N';
dfs(ntx1,ntx2,nty,Miss + 1);
while (v > y) c[x1][--v] = 'H';
}
else dfs(ntx1,ntx2,nty,Miss);
}
}
}
if (c[x1][y] == 'H' && c[x2][y] == 'H'){
int Miss = miss + f(t - 2);
for (int i = 0;i < 6;i++){
int ntx1 = mvDN[i];
for (int j = 0;j < 6;j++){
int ntx2 = mvDN[j];
if (ntx1 == ntx2) continue;
if (ntx1 < 1 || ntx2 > 6) continue;
int flag = 0;
int v1 = y,v2 = y;
if (c[x1][nty] == 'H' && ntx1 != x1){
while (c[x1][v1] == 'H') c[x1][v1++] = 'N';
flag += 1;
}
if (c[x2][nty] == 'H' && ntx2 != x2){
while (c[x2][v2] == 'H') c[x2][v2++] = 'N';
flag += 1;
}
dfs(ntx1,ntx2,nty,Miss + flag);
while (v1 > y) c[x1][--v1] = 'H';
while (v2 > y) c[x2][--v2] = 'H';
}
}
}
for (int i = 1;i <= 6;i++){
while (vv[y][i] > y) c[i][--vv[y][i]] = 'H';
}
}
int main(){
scanf("%d",&n);
for (int i = 1;i <= n;i++){
for (int j = 1;j <= 6;j++){
scanf(" %c",&c[j][i]);
}
}
for (int i = 1;i <= 6;i++) c[i][0] = 'N';
dfs(1,6,0,0);
if (minn == 0){
cout << "ALL PERFECT!!!" << endl;
cout << "1000000" << endl;
cout << "SUPER XIAOCHA TIME!!!" << endl;
}
else{
cout << "Miss" << endl;
cout << minn << endl;
}
return 0;
}