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