算法題_組隊

題目:
在這裏插入圖片描述

在這裏插入圖片描述
接下來我們用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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章