⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vb.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
字号:
/*   (C) 2001 by Argonne National Laboratory.       See COPYRIGHT in top-level directory.*/#include <stdio.h>#include <string.h>#include "mpi.h"#define MPE_GRAPHICS#include "mpe.h"#define MAXBLOCKS    2000#define SCREEN_WIDTH 600#define SCREEN_HEIGHT 800#define TABLE         (SCREEN_HEIGHT-100)typedef struct _block{  int col;  int level;  int orig;  int over;  int final;} block;block blocks[MAXBLOCKS+1];int   num_blocks;int   plan_length;int   blockdim;int   col_sep;int   current_column;static FILE *tty;MPE_XGraph handle;main(argc,argv)     int argc;     char *argv[];{  int i, width, height;  char junk1[100];  char junk2[100];  char menu();  tty = fopen( "/dev/tty", "r" );  read_states();  fscanf(stdin,"%s %s %d", junk1, junk2, &plan_length);/*  printf("%s %s %d for %d blocks\n", junk1, junk2, plan_length, num_blocks);  dump_state();*/  set_sizes();  MPI_Init(&argc, &argv);  width = SCREEN_WIDTH;  height = SCREEN_HEIGHT;  MPE_Open_graphics( &handle, MPI_COMM_WORLD, (char*)0, 		    -1, -1, width, height, MPE_GRAPH_INDEPDENT);  for (i = 0; i < 10; i = i+2 )    MPE_Draw_line(handle, 50, TABLE+blockdim+i, width-50, TABLE+blockdim+i,		  MPE_BLACK);	/* draw table */  draw_state();  for(;;) switch( menu() ) {    case 's':                 /* show plan */      process_moves();/*      gets(junk1); gets(junk2); */      break;    case 'q':      MPE_Close_graphics(&handle);      MPI_Finalize();      exit(0);    case 'n':                 /* next problem */      read_states();      fscanf(stdin,"%s %s %d", junk1, junk2, &plan_length);/*      printf("%s %s %d for %d blocks\n",junk1,junk2, plan_length, num_blocks);*/      draw_state();      break;  }}char menu(){    char c;    printf("s(how),  n(ext),  q(uit):  ");  fflush(stdout);    do	c = getc(tty);    while (!strchr("snq",c));    return c;}set_sizes(){  if (num_blocks < 21)    {      blockdim = 16;      col_sep  = 32;    }  else if (num_blocks < 101)    {      blockdim = 6;      col_sep  = 8;    }  else if (num_blocks < 1001)    {      blockdim = 4;      col_sep  = 6;    }  else if (num_blocks < 2001)    {      blockdim = 2;      col_sep  = 3;    }  else    {      blockdim = 1;      col_sep  = 2;    }}read_states(){  int i, n;  fscanf(stdin,"%d",&num_blocks);  for (i = 1; i <= num_blocks; i++)      fscanf(stdin,"%d",&blocks[i].orig);  for (i = 1; i <= num_blocks; i++)      fscanf(stdin,"%d",&blocks[i].final);}set_pos(n)int n;{    if (blocks[n].col == 0)	/* postion not yet set */    {	if (blocks[n].over == 0)	/* block is on table */	{	    blocks[n].level = 0;	    blocks[n].col   = current_column++;	}	else	{	    set_pos(blocks[n].over); /* set position of block underneath */	    blocks[n].level = blocks[blocks[n].over].level + 1;	    blocks[n].col   = blocks[blocks[n].over].col;	}    }}dump_state(){  int i;  for (i = 1; i <= num_blocks; i++)    printf("block %d at level %d in col %d over block %d, destination %d\n", i,	   blocks[i].level, blocks[i].col, blocks[i].over, blocks[i].final);  printf("Plan length = %d\n", plan_length);}draw_state(){  int i;  MPE_Fill_rectangle(handle,0,0,SCREEN_WIDTH,TABLE+blockdim,MPE_WHITE);  current_column = 1;  for (i = 1; i <= num_blocks; i++) {      blocks[i].over = blocks[i].orig;      blocks[i].col = 0;  }  for (i = 1; i <= num_blocks; i++)      set_pos(i);  for (i = 1; i <= num_blocks; i++)    MPE_Fill_rectangle(handle,		       50 + (blocks[i].col)*col_sep,		       TABLE - (blocks[i].level)*blockdim,		       blockdim, blockdim, MPE_BLACK);  MPE_Update(handle);}process_moves(){  int i, from, to;  char mvnum[16], theto[4];  for (i = 1; i <= plan_length; i++)    {      fscanf(stdin,"%s %d %s %d", mvnum, &from, theto, &to);      move_block(from, to);    }}move_block(from, to)int from, to;{/*  printf("moving %d to %d\n", from, to);*/  MPE_Fill_rectangle(handle,		     50 + (blocks[from].col)*col_sep,		     TABLE - (blocks[from].level)*blockdim,		     blockdim, blockdim, MPE_WHITE); /* erase block */    if (to == 0)			/* target is table */    {	if (blocks[from].final == 0) {	    MPE_Fill_rectangle(handle,			       50 + (current_column)*col_sep,			       TABLE,			       blockdim, blockdim, MPE_GREEN);	    blocks[from].over  = 0;	    blocks[from].level = 0;	    blocks[from].col   = current_column++;	}	else {	    blocks[from].over  = 0;	    blocks[from].level = 0;	    blocks[from].col = -50;	}    }  else				/* target is another block */    {	MPE_Color color;	if (blocks[from].col < 0)	    color = MPE_RED;	else	    color = MPE_GREEN;      MPE_Fill_rectangle(handle,			 50 + (blocks[to].col)*col_sep,			 TABLE - (blocks[to].level + 1)*blockdim,			 blockdim, blockdim, color);      blocks[from].over  = to;      blocks[from].level = blocks[to].level + 1;      blocks[from].col   = blocks[to].col;    }  MPE_Update(handle);  /* sleep(1); */}/* highly incomplete, and probably not worth doing....*/move_block_slowly(from, to)int from, to;{  double step;  double incr = .01;  int   xfrom, yfrom, xtarget, ytarget;  printf("moving %d to %d\n", from, to);  xfrom = 50 + (blocks[from].col)*col_sep;  yfrom = TABLE - (blocks[from].level)*blockdim;    if (to == 0)			/* target is table */    {      xtarget       = 50 + (current_column++)*col_sep;      ytarget       = TABLE;      for (step = incr; step <= 1.0; step += incr)	{	  MPE_Fill_rectangle(handle,		     (int)((step-incr)*xtarget+(1.0-(step-incr))*xfrom),		     (int)((step-incr)*ytarget+(1.0-(step-incr))*yfrom),		     blockdim, blockdim, MPE_WHITE); /* erase block */	  MPE_Fill_rectangle(handle,		     (int) (step*xtarget + (1.0-step)*xfrom),		     (int) (step*ytarget + (1.0-step)*yfrom),		     blockdim, blockdim, MPE_BLACK);	  MPE_Update(handle);	}      MPE_Fill_rectangle(handle, xtarget, ytarget,			 blockdim, blockdim, MPE_BLACK);      MPE_Update(handle);      blocks[from].over  = 0;      blocks[from].level = 0;      blocks[from].col   = current_column - 1;    }  else				/* target is another block */    {      MPE_Fill_rectangle(handle,			 50 + (blocks[to].col)*col_sep,			 TABLE - (blocks[to].level + 1)*blockdim,			 blockdim, blockdim, MPE_BLACK);      blocks[from].over  = to;      blocks[from].level = blocks[to].level + 1;      blocks[from].col   = blocks[to].col;    }  MPE_Update(handle);  /* sleep(1); */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -