这是一道典型的搜索剪枝型的题目。代码如下,我并没有要求输入字母那一项,直接以我排好的ABCDEFGHIJKLMN来代替。代码如下:
#include <iostream>
using namespace std;
#define MAXNUM 100
#define MAXVALUE 255
int V[MAXNUM][MAXNUM];
char str[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int N,M,K=1;
typedef struct c{
int l,p,m,n;
char a;
}c;
c arr[200];
bool dfs(int p,int t,int z){
if(p==M+1)
return 1;
else{
for(int i=1;i<=M;i++){
if(V[t][i]!=-1)
continue;
bool flag=true;
for(int j=1;j<K;j++){
if(arr[j].l==t&&arr[j].p==i&&V[arr[j].m][arr[j].n]!=-1){
if(V[arr[j].m][arr[j].n]==p&&arr[j].a=='N'){
flag=false;
break;
}
if(V[arr[j].m][arr[j].n]!=p&&arr[j].a=='R'){
flag=false;
break;
}
}else if(arr[j].m==t&&arr[j].n==i&&V[arr[j].l][arr[j].p]!=-1){
if(V[arr[j].l][arr[j].p]==p&&arr[j].a=='N'){
flag=false;
break;
}
if(V[arr[j].l][arr[j].p]!=p&&arr[j].a=='R'){
flag=false;
break;
}
}
}
if(flag==false)
continue;
V[t][i]=p;
if(t==N){
if(dfs(p+1,1,z))
return 1;
}else{
if(dfs(p,t+1,z))
return 1;
}
V[t][i]=-1;
}
return 0;
}
}
int main(){
char a;
int s;
cin>>s;
while(s--){
for(int i=0;i<=MAXNUM;i++)
for(int j=0;j<MAXNUM;j++)
V[i][j]=-1;
cin>>N>>M;
int l,p,m,n;
while(true){
cin>>l>>p>>a>>m>>n;
if(l==0)
break;
arr[K].l=l,arr[K].p=p,arr[K].m=m,arr[K].n=n,arr[K].a=a;
K++;
}
dfs(1,1,K);
}
for(int i=1;i<=M;i++){
for(int j=1;j<=N;j++){
for(int k=1;k<=M;k++){
if(V[j][k]==i)
cout<<str[(j-1)*M+k-1];
}
}
cout<<endl;
}
}