求AC代码(请勿误解)
查看原帖
求AC代码(请勿误解)
525223
敢问高姓大名楼主2024/7/31 18:04

自制题 题目传送门

蹲一个有空闲时间的大佬来帮我写写更简单的解法

本人代码高达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;
}
2024/7/31 18:04
加载中...