高手请进!!算法的可视化实现

tiancai1 2005-03-18 06:09:03
本人有两个算法用C语言写,由于需要要转化为VC的可视化实现.一经采用给200分.给我留言和你的EMAIL;谢谢.
...全文
367 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiancai1 2005-04-17
  • 打赏
  • 举报
回复
孔孔
tiancai1 2005-04-13
  • 打赏
  • 举报
回复
tiancai1 2005-04-10
  • 打赏
  • 举报
回复
高手!!!
erben 2005-04-09
  • 打赏
  • 举报
回复
很容易吧?把输入数据用界面输入
tiancai1 2005-04-07
  • 打赏
  • 举报
回复
题目:
太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。
皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;某些宫殿间可以互相望见(重点)。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。
可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。
编程任务:
帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少
tiancai1 2005-04-07
  • 打赏
  • 举报
回复
vcmute 2005-04-06
  • 打赏
  • 举报
回复
定义数组int g[MAX_N+1][MAX_N+1];用来存储方块的索引
work();后调用方法:deal(1,1,n,n,1);填充到N*N矩阵g

void deal(int x,int y,int w,int h,int b)
{
if(w==h)
{
if(f[w][h]==1)
{
for(int i=0;i<w;i++)
for(int j=0;j<h;j++)
g[x+i][y+j]=b;
return;
}
}
else if(h>w)
{
for(int k = ( h / 2 ); k < h; k++ )
if(f[w][h] == f[w][k] + f[w][h-k] )
{
deal(x,y,w,k,b);
deal(x,y+k,w,h-k,b+f[w][k]);
return;
}
// printf("err");exit();
}
for(int k = ( w / 2 ); k < w; k++ )
if(f[w][h] == f[k][h] + f[w-k][h] )
{
deal(x,y,k,h,b);
deal(x+k,y,w-k,h,b+f[k][h]);
}
// printf("err");exit();
}
打印g矩阵即可,如
int x, y;

for( x = 1; x <= n; x++ )
{
for( y = 1; y <= n; y++ )
printf("%5d",g[x][y]);
printf("\n");
}
wqs6 2005-04-06
  • 打赏
  • 举报
回复
你干脆把题目贴出来

省得大家不方便
tiancai1 2005-04-06
  • 打赏
  • 举报
回复
谢谢vcmute(横秋)
我想把它的结果输出是画图的方式。
再贴一个
把它的输出用图形表示即是树图,
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include <string.h>
//#include <values.h>

#define MAX_N 1500+1
#define INPUT_FILE "INPUT.TXT"
#define OUTPUT_FILE "OUTPUT.TXT"
#define false 0
#define true 1


typedef struct node
{ /* 定义树的结点类型 */
int label; /* 节点的儿子的标号 */
struct node* next; /* 下一个儿子节点 */
} NODE;

int f[MAX_N][3]; /* 存储最优化函数的值 */
NODE* Tree[MAX_N]; /* Tree[i] 存储树的结点i的第一个儿子的指针 */
int Cost[MAX_N]; /* 存储每个结点i上布置守卫的费用 */
int n; /* 节点的数目 */
int root; /* 根结点的标号 */
FILE *fin, *fout; /* 输入输出文件 */



int ReadCase() /* 读入数据 */
{
int count, i, m;
NODE* p;
int IsRoot[MAX_N]; /* 计算节点i是否是根结点 */


if( feof(fin) )
return false;

memset( Tree, 0, sizeof(Tree) ); /* 初始化 */
memset( IsRoot, true, sizeof(IsRoot) );

fscanf(fin, "%d", &n);
for( count = 1; count <= n; count++ )
{
fscanf( fin, "%d" , &i);
fscanf( fin, "%d", &Cost[i]);
fscanf( fin, "%d", &m );
for ( ; m>0; m-- ) /* 读入节点i的儿子结点,插入链表中 */
{
assert( p = (NODE*)malloc(sizeof(NODE)) );
fscanf(fin, "%d", &p->label);
IsRoot[p->label] = false; /* 因为p->label是某个节点的儿子,所以肯定不是根结点了 */
p->next = Tree[i];
Tree[i] = p;
}
}

/* 找到根结点的标号 */
for( i = 1; i <= n; i++ )
if( IsRoot[i] )
{
root = i;
break;
}

return true;
}

int Min(int a, int b)
{
if( a < b )
return a;
else
return b;
}


int CalF( int t, int j) /* 计算f(t,j)的值 */
{
NODE *k, *i;
int s, res;

if( f[t][j] >= 0 ) /* 如果已经计算过了就不用再算了 */
return f[t][j];
if( Tree[t] == NULL ) /* 如果结点t是叶子结点 */
{
f[t][0] = Cost[t];
f[t][1] = 0;
f[t][2] = Cost[t];
return f[t][j];
}
res = MAX_N;
switch( j ) {
case 0: k = Tree[t];
while( k ) {

/* 累加除了儿子结点k以外各项的最优代价 */
i = Tree[t];
s = 0;
while( i ) {
if( i!= k)
s += Min( CalF(i->label,0), CalF(i->label,2) );
i = i->next;
}
res = Min( res, s + CalF(k->label,2) ); /* 记录res的最优值, 公式(1) */
k = k->next;
}
break;
case 1: i = Tree[t];
s = 0;
while( i ) { /* 公式(2) */
s += Min( CalF(i->label,0), CalF(i->label,2) );
i = i->next;
}
res = s;
break;
case 2: i = Tree[t];
s = 0;
while( i ) { /* 公式(3) */
s += Min( CalF(i->label,1), CalF(i->label,2) );
i = i->next;
}
res = s + Cost[t];
break;
}

f[t][j] = res;
return res;
}


void SolveCase() /* 解决问题 */
{
memset( f, -1, sizeof(f) ); /* 初始化,全部填-1,表示还没有计算过 */
fprintf( fout, "%d", Min( CalF(root,0), CalF(root,2) ) );
}

void main()
{
char filename[10]="input.txt";
if((fin = fopen( filename, "r" ))!=NULL)
printf("oK");
else
printf("faile");
//
// assert( );
assert( fout = fopen( OUTPUT_FILE, "w" ) );

if( ReadCase() )
SolveCase();

fclose( fin );
fclose( fout );
return;

}
输入数据由文件名为INPUT.TXT的文本文件提供。输入文件中数据表示一棵树,描述如下:
第1行 n,表示树中结点的数目。
第2行至第n+1行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号i(0<i<=n),在该宫殿安置侍卫所需的经费k,该边的儿子数m,接下来m个数,分别是这个节点的m个儿子的标号r1,r2,...,rm。
对于一个n(0 < n <= 1500)个结点的树,结点标号在1到n之间,且标号不重复
我想把输出为用画图的方式输出,即输出一个树图。



tiancai1 2005-04-05
  • 打赏
  • 举报
回复
高手请看看啊!!
0011411 2005-04-05
  • 打赏
  • 举报
回复
tiancai1 2005-04-05
  • 打赏
  • 举报
回复
没人帮忙吗?
tiancai1 2005-04-04
  • 打赏
  • 举报
回复
题目:
用边长小于N的正方形方砖(不要求所有的方砖大小相同)不重叠地铺满N*N的正方形房间;
代码:
#include <stdio.h>
#define MAX_N 100

int n;
int f[MAX_N+1][MAX_N+1];

int min( int a, int b )
{
if( a < b )
return a;
else
return b;
}

int CalF( int x, int y )
{
int res, k;

if( ( x == y ) && ( x < n ) )
return 1;
else
{
res = 100000;
for( k = ( x / 2 ); k < x; k++ )
res = min( res, f[k][y] + f[x-k][y] );
return res;
}
}

void work()
{
int x, y;

for( x = 1; x <= n; x++ )
for( y = 1; y <= n; y++ )
{
f[x][y] = CalF(x,y);
f[y][x] = f[x][y];
}
}

void main()
{
for( n = 2; n <= MAX_N; n++ )
{
work();
printf("%5d %5d\n",n,f[n][n]);
}
}
把这段代码转化为,
可以实现输入不同的数值而画出相应的方砖分布。关键是实现
最后的图形分布。
例如:
如果 n=4;
则:
AABB
AABB
CCDD
CCDD
只要体现出四块砖分布即可。
先贴一个。
kl222 2005-04-02
  • 打赏
  • 举报
回复
给我看看 job263@163.com
tiancai1 2005-04-02
  • 打赏
  • 举报
回复
怎么没有高手吗?
tiancai1 2005-03-27
  • 打赏
  • 举报
回复
Featured 2005-03-25
  • 打赏
  • 举报
回复
C语言写的算法,(没有graphic之类库的话)
可以直接在VC下面编译的啊。

楼主发给我,今晚正好有空,帮你看看
featured@mail.csdn.net
surstar 2005-03-25
  • 打赏
  • 举报
回复
yuhejun@126.com

我想搂住这100分是散的吧,接分~
tiancai1 2005-03-25
  • 打赏
  • 举报
回复
如果你不便留下你的email 你可以给我发送留言,在留言中写上即可。
tiancai1 2005-03-25
  • 打赏
  • 举报
回复
怎么没人回答啊
加载更多回复(14)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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