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

qq_33536070 2015-12-29 04:57:22
加精


各位大神帮帮忙。。毫无思绪
...全文
2638 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37155809 2019-10-08
  • 打赏
  • 举报
回复
建楼
new举个栗子 2018-10-11
  • 打赏
  • 举报
回复
emmmmm,把这块田看做是一个二维数组 然后定义一个枚举 用来表示有矿 无矿那些,然后再按条件给数组赋值 打印
yuebuqun09 2016-07-20
  • 打赏
  • 举报
回复
cwywx 2016-01-14
  • 打赏
  • 举报
回复
引用 19 楼 zhao4zhong1 的回复:
不考虑矿,不中心对称,又必须分别包含中心的四块大小和形状都相同的可行的划分方案谁能想的出来?
您的算法也是在“中心对称”这个前提下做出的吧,所以要证明一下吧。
赵4老师 2016-01-14
  • 打赏
  • 举报
回复
不考虑矿,不中心对称,又必须分别包含中心的四块大小和形状都相同的可行的划分方案谁能想的出来?
cwywx 2016-01-14
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 和A四连通且占据9个方块且中心对称且不占B、C、D的划分方法可以靠楼主的人脑遍历出所有可能。 在所有这些可能中挑出恰好可让四个公司都包含煤矿铁矿各一个的哪些方案。
[/quote] 前面的思路,我和您的一样,但是我卡在要证明他是中心对称这个问题上了。 怎么证明啊?
cccjz 2016-01-10
  • 打赏
  • 举报
回复
我来看烟花 2016-01-10
  • 打赏
  • 举报
回复
这是个神奇的算法
_明月 2016-01-08
  • 打赏
  • 举报
回复
我看到楼主的这个题,让我想起了当时我上初一时的一类数学题。 感觉这个题,完全可以静下心来,自己去遍历的推论、演算出来! 穷举法一直是一个非常棒的方法,但是对于一些次数较多的问题,穷举法就不适合了。这个还得去寻找其他的简便方法解决。
paschen 2016-01-08
  • 打赏
  • 举报
回复
之前没看到,已推荐
赵4老师 2016-01-08
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。 “给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
qq_33536070 2016-01-08
  • 打赏
  • 举报
回复
解释一下程序吧。。我不太懂
qq_33536070 2016-01-08
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
求版主推荐!Orz
没太看明白。。能不能解释一下
赵4老师 2016-01-06
  • 打赏
  • 举报
回复
求版主推荐!Orz
赵4老师 2016-01-04
  • 打赏
  • 举报
回复
//有一个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
//
//
lantianxiayang 2016-01-02
  • 打赏
  • 举报
回复
有谁做出来了吗 求源码!!!
赵4老师 2015-12-30
  • 打赏
  • 举报
回复
楼上图案考虑不是很全,楼主脑补吧。
赵4老师 2015-12-30
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
和A四连通且占据9个方块且中心对称且不占B、C、D的划分方法可以靠楼主的人脑遍历出所有可能。
在所有这些可能中挑出恰好可让四个公司都包含煤矿铁矿各一个的哪些方案。

lm_whales 2015-12-29
  • 打赏
  • 举报
回复
先确定总站的方案,四个位置各占一个 然后为每个公司确定煤和铁的方格 按照最短路径选出, 最后,分割剩余未分割的区域
fly_dragon_fly 2015-12-29
  • 打赏
  • 举报
回复
看起来象是搜索问题, 每个公司都是9块,看9块能够产生什么形状
加载更多回复(1)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧