user-0 提问: 关于矩阵的问题,请大神帮忙指点一下

回复:
user: user-1
content: 仅供参考：//有一个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 // //

user: user-1
content: 仅供参考，仅供参考。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:仅供参考：//有一个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 // //   不是很明白,我现在做的每个 # 的位置固定, 现在变换没有做好. 能给点提示吗? 比如  ### ## 怎样变换成 #0#0# 0#0#0  或者 ### 00##