69,369
社区成员
发帖
与我相关
我的任务
分享
//有一个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
//
//