題目:
接下來我們用C++代碼進行編程:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#define maxn 9
#define maxm 9
#define maxx 52
using namespace std;
bool hate[maxx][maxx];
bool lov[maxx][maxx];
char nam[maxx];
int pick[maxm][maxn];
bool vis[maxx];
int n,m;
inline int toid (int i, int j){
return i*m + j;
}
bool flg = 0;
void DFS(int tm,int tn){
if(flg)
return;
if(tn == n){
flg = 1;
//cout << "adsdasdasdas";
return;
}
if(pick[tm][tn] == -1){
for(int i = 0; i < m; i++){
int t = toid(tn,i);
if(!vis[t]) {
bool flgg = 1;
for(int j = 0; j < tn; j++){
int c = pick[tm][j];
if(hate[c][t]){
flgg = 0;
break;
}
}
queue<int>que;
que.push(t);
queue<int>quee;
while(!que.empty()){
int k = que.front();
que.pop();
for(int j = 0; j < n; j++){
if(pick[tm][j] == -1)
continue;
int c = pick[tm][j];
if(hate[c][k]){
flgg = 0;
break;
}
}
for(int j = 0; j < maxx; j++){
if (j == t)
continue;
if(lov[t][j]){
if(!vis[j] && pick[tm][j/m] == -1){
que.push(j);
quee.push(j);
pick[tm][j/m] = j;
} else if(pick[tm][j/m] == j){
continue;
}else{
flgg = 0;
}
}
}
}
if(flgg){
vis[t] = 1;
pick[tm][tn] = t;
if(tm == m-1)
DFS(0,tn+1);
else
DFS(tm+1,tn);
if(flg)
return;
vis[t] = 0;
pick[tm][tn] = -1;
}
while(!quee.empty()){
int k = quee.front();
quee.pop();
pick[tm][k/m] = -1;
vis[k] = 0;
}
}
}
}else{
if(tm == m-1)
DFS(0,tn+1);
else
DFS(tm+1,tn);
}
return;
}
int main(){
cin >> n >> m;
memset(pick,-1,sizeof(pick));
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j++) {
int c = toid(i,j);
cin >> nam[c];
}
}
int ai,aj,bi,bj;
char c;
while(cin >> ai >> aj >> c >> bi >> bj) {
if(ai == 0)
break;
if(c == 'N'){
int ta = toid(ai-1,aj-1), tb = toid(bi-1,bj-1);
//cout << "hate" << nam[ta] << " " << nam[tb] << endl;
hate[ta][tb] = 1;
hate[tb][ta] = 1;
}
if(c == 'Y'){
int ta = toid(ai-1,aj-1), tb = toid(bi-1,bj-1);
//cout << "love" << nam[ta] << " " << nam[tb] << endl;
lov[ta][tb] = 1;
lov[tb][ta] = 1;
}
}
queue<int>que;
for(int i = 0; i < m; i++){
que.push(i);
vis[i] = 1;
pick[i][0] = i;
while(!que.empty()){
int k = que.front();
que.pop();
for(int j = 0; j < m*n; j++){
if(lov[k][j] && !vis[j]){
pick[i][j/m] = j;
vis[j] = 1;
que.push(j);
}
}
}
}
/*for(int i = 0; i < m; i++){
for(int j = 0; j < n; j ++) {
cout<<pick[i][j] << " ";
}
cout <<endl;
}*/
DFS(0,1);
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++) {
cout<< nam[pick[i][j]];
}
cout <<endl;
}
}