求指导算法问题,资源分配!跪

C语言 码拜 8年前 (2016-05-06) 999次浏览
求指导算法问题,资源分配!跪求指导算法问题,资源分配!跪求指导算法问题,资源分配!跪
各位高手帮帮忙。毫无思绪求指导算法问题,资源分配!跪
解决方案

100

求指导算法问题,资源分配!跪

//有一个6x6的矿区,分布有4处铁矿和4处煤矿,中心2x2已预先分配给4家公司经营。
//要求给出全部可能,将整个矿区划分为形状相同,内部连通,且恰好包含铁矿煤矿各一处的4块
//给这4家公司。
// 012345  012345  012345
//0...... 0.....M 0CCAAAA
//1...... 1....I. 1CCABAA
//2..AB.. 2...M.. 2CAABBB
//3..CD.. 3..MMI. 3CCCDDB
//4...... 4..I... 4DDCDBB
//5...... 5....I. 5DDDDBB
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
char W[6][6];
char M[6][6];
int Y[9],X[9];
char S[1000][37];
char s[37];
int N=0;
void divide(int y,int x,int L) {
    int m,y1,x1;
    int b,y2,x2;
    Y[L]=y;X[L]=x;
    W[  y][  x]="A";
    W[  x][5-y]="B";
    W[5-x][  y]="C";
    W[5-y][5-x]="D";
    if (L>=8) {
        for (y1=0;y1<6;y1++) {
            for (x1=0;x1<6;x1++) {
                s[y1*6+x1]=W[y1][x1];
            }
        }
        s[36]=0;
        for (m=0;m<N;m++) if (0==strcmp(s,S[m])) break;
        if (m>=N) {
            strcpy(S[N],s);
            N++;
//          printf("N%d:\n",N);
//          for (m=0;m<6;m++) printf("%.6s\n",s+m*6);
//          printf("\n");
//          getchar();
            if (N>=1000) {
                printf("N>=1000!\n");
                exit(1);
            }
        }
        W[  y][  x]=".";
        W[  x][5-y]=".";
        W[5-x][  y]=".";
        W[5-y][5-x]=".";
        return;
    }
    for (b=L;b>=0;b--) {
        y2=Y[b];x2=X[b];
        if ((y2>0 && W[y2-1][x2  ]==".")
         || (x2>0 && W[y2  ][x2-1]==".")
         || (y2<5 && W[y2+1][x2  ]==".")
         || (x2<5 && W[y2  ][x2+1]==".")) {
            for (m=0;m<4;m++) {
                switch (m) {
                case 0://上
                    y1=y2-1;x1=x2;
                    if (y1<0) continue;
                break;
                case 2://左
                    y1=y2;x1=x2-1;
                    if (x1<0) continue;
                break;
                case 1://下
                    y1=y2+1;x1=x2;
                    if (y1>5) continue;
                break;
                case 3://右
                    y1=y2;x1=x2+1;
                    if (x1>5) continue;
                break;
                }
                if (W[  y1][  x1]=="."
                 && W[  x1][5-y1]=="."
                 && W[5-x1][  y1]=="."
                 && W[5-y1][5-x1]==".") {
                    divide(y1,x1,L+1);
                    W[  y1][  x1]=".";
                    W[  x1][5-y1]=".";
                    W[5-x1][  y1]=".";
                    W[5-y1][5-x1]=".";
                }
            }
        }
    }
}
int main() {
    int i,n,a,b,t;
    int d[36];
    int y,x;
    int Ic[4],Mc[4];
    srand(time(NULL));
    n=36;
    for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
    for (i=n;i>0;i--) {/* 打乱0~n-1 */
        a=i-1;b=rand()%i;
        if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
    }
    for (y=0;y<6;y++) for (x=0;x<6;x++) {
        W[y][x]=".";M[y][x]=".";
    }
    for (i=0;i<4;i++) M[d[i]/6][d[i]%6]="I";//铁
    for (i=4;i<8;i++) M[d[i]/6][d[i]%6]="M";//煤
    for (y=0;y<6;y++) {
        for (x=0;x<6;x++) {
            printf("%c",M[y][x]);
        }
        printf("\n");
    }
    printf("\n");
    divide(2,2,0);
    n=0;
    for (i=0;i<N;i++) {
        for (t=0;t<4;t++) {Ic[t]=0;Mc[t]=0;}
        for (y=0;y<6;y++) {
            for (x=0;x<6;x++) {
                if (M[y][x]=="I") Ic[S[i][y*6+x]-"A"]++;
                if (M[y][x]=="M") Mc[S[i][y*6+x]-"A"]++;
            }
        }
        if (Ic[0]==1 && Ic[1]==1 && Ic[2]==1 && Ic[3]==1
         && Mc[0]==1 && Mc[1]==1 && Mc[2]==1 && Mc[3]==1) {
            n++;
            printf("%d:\n",n);
            for (t=0;t<6;t++) printf("%.6s\n",S[i]+t*6);
            printf("\n");
        }
    }
    if (n==0) printf("Impossible.\n");
    return 0;
}
//..M...
//I.M..I
//......
//...M.M
//...I..
//....I.
//
//1:
//CCCAAA
//CAAABA
//CCABBA
//DCCDBB
//DCDDDB
//DDDBBB
//
//2:
//CCCAAA
//CCAAAA
//CCABBA
//DCCDBB
//DDDDBB
//DDDBBB
//
//

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求指导算法问题,资源分配!跪
喜欢 (0)
[1034331897@qq.com]
分享 (0)