40pts RE求助
查看原帖
40pts RE求助
189314
DFSer楼主2023/1/24 13:56

只A了前4个点,后面全RE,数组范围已经调大了,求dalao帮助。

主要思路:用类似DFS的思想枚举所有情况,具体看代码可能更好理解。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

int charmap(char c){
	if(c == 'W')return 1;
	else if(c == 'I')return 2;
	else if(c == 'N')return 3;
	else if(c == 'G')return 4;
	else return 0;
}

char f[2010][2010];
bool used[10];
string s;
bool mp[10][10][10];
int w,i,n,g,slen,j;

void dfs(int l,int k){
	if(k == slen+1){
		if(f[0][slen-1]!='/')used[charmap(f[0][slen-1])] = 1;
		return;
	}
	int r = l+k-1;
	if(r>=slen){dfs(0,k+1);return;}
	bool flag = 0;
	for(j = l;j<r;j++){
		if(mp[1][charmap(f[l][j])][charmap(f[j+1][r])]){
			flag = 1;
			f[l][r] = 'W';
			dfs(l+1,k);
		}
		if(mp[2][charmap(f[l][j])][charmap(f[j+1][r])]){
			flag = 1;
			f[l][r] = 'I';
			dfs(l+1,k);
		}
		if(mp[3][charmap(f[l][j])][charmap(f[j+1][r])]){
			flag = 1;
			f[l][r] = 'N';
			dfs(l+1,k);
		}
		if(mp[4][charmap(f[l][j])][charmap(f[j+1][r])]){
			flag = 1;
			f[l][r] = 'G';
			dfs(l+1,k);
		}
	}
	if(!flag){f[l][r] = '/';dfs(l+1,k);}
}

int main(){
	scanf("%d%d%d%d",&w,&i,&n,&g);
	char o[4];
	for(j = 1;j<=w;j++){
		scanf("%s",o+1);
		mp[1][charmap(o[1])][charmap(o[2])] = 1;
	}
	for(j = 1;j<=i;j++){
		scanf("%s",o+1);
		mp[2][charmap(o[1])][charmap(o[2])] = 1;
	}
	for(j = 1;j<=n;j++){
		scanf("%s",o+1);
		mp[3][charmap(o[1])][charmap(o[2])] = 1;
	}
	for(j = 1;j<=g;j++){
		scanf("%s",o+1);
		mp[4][charmap(o[1])][charmap(o[2])] = 1;
	}
	cin>>s;
	slen = s.size();
	for(int i = 0;i<slen;i++)f[i][i] = s[i];
	dfs(0,2);
	bool isok = used[1]||used[2]||used[3]||used[4];
	if(used[1])printf("W");
	if(used[2])printf("I");
	if(used[3])printf("N");
	if(used[4])printf("G");
	if(!isok)puts("The name is wrong!");
	return 0;
}
2023/1/24 13:56
加载中...