user-0 提问: 求解算法问题，资源分配！！跪！！

回复:
user: user-1
content: 建楼

user: user-2
content: emmmmm，把这块田看做是一个二维数组 然后定义一个枚举 用来表示有矿 无矿那些，然后再按条件给数组赋值 打印

user: user-3

user: user-4
content: 引用 19 楼 zhao4zhong1 的回复:不考虑矿，不中心对称，又必须分别包含中心的四块大小和形状都相同的可行的划分方案谁能想的出来？  您的算法也是在“中心对称”这个前提下做出的吧，所以要证明一下吧。

user: user-5
content: 不考虑矿，不中心对称，又必须分别包含中心的四块大小和形状都相同的可行的划分方案谁能想的出来？

user: user-4
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 和A四连通且占据9个方块且中心对称且不占B、C、D的划分方法可以靠楼主的人脑遍历出所有可能。 在所有这些可能中挑出恰好可让四个公司都包含煤矿铁矿各一个的哪些方案。 [/quote]  前面的思路，我和您的一样，但是我卡在要证明他是中心对称这个问题上了。 怎么证明啊？

user: user-6

user: user-7

user: user-8
content: 这是个神奇的算法

user: user-9
content: 我看到楼主的这个题，让我想起了当时我上初一时的一类数学题。  感觉这个题，完全可以静下心来，自己去遍历的推论、演算出来！  穷举法一直是一个非常棒的方法，但是对于一些次数较多的问题，穷举法就不适合了。这个还得去寻找其他的简便方法解决。

user: user-10
content: 之前没看到，已推荐

user: user-5
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-0
content: 解释一下程序吧。。我不太懂

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:求版主推荐！Orz  没太看明白。。能不能解释一下

user: user-5
content: 求版主推荐！Orz

user: user-5
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-11
content: 有谁做出来了吗   求源码！！！

user: user-5
content: 楼上图案考虑不是很全，楼主脑补吧。

user: user-5
content: 引用 1 楼 zhao4zhong1 的回复:和A四连通且占据9个方块且中心对称且不占B、C、D的划分方法可以靠楼主的人脑遍历出所有可能。 在所有这些可能中挑出恰好可让四个公司都包含煤矿铁矿各一个的哪些方案。

user: user-12
content: 先确定总站的方案，四个位置各占一个 然后为每个公司确定煤和铁的方格 按照最短路径选出， 最后，分割剩余未分割的区域