各位高手帮帮忙。毫无思绪
解决方案
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 // //