• 大小: 6KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-06
  • 语言: 其他
  • 标签:

资源简介

通过减少问题规模形式,做并行计算,求解把皇后及N皇后问题,mpi,MPI,思想是将前两个皇后进行初始化

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include   
#define N 6                    //矩阵的阶数  
#define max 13
#define impossible max*max
#define MASTER 0                  //主进程号  
#define FROM_MASTER 1             //设置消息类型  
#define FROM_WORKER 2             //设置消息类型  
MPI_Status status;
int queen[max];
int sum=0;  
void show() /* 输出所有皇后的坐标 */  
{  
    int i; 
    for(i = 0; i < max; i++)  
    { 
         printf(“(%d%d) “ i queen[i]);

    }  
printf(“\n“);  
    sum++;  
}  
int check(int n) /* 检查当前列能否放置皇后 */  
{  
    int i;  
    for(i = 0; i < n; i++) /* 检查横排和对角线上是否可以放置皇后 */  
    {  
        if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i))  
        {  
            return 1;  
        }  
    }  
    return 0;  
}  
int put(int n) /* 回溯尝试皇后位置n为横坐标 */  
{  

    int ij;  
    for(i = 0; i < max; i++)  
    {      
   queen[n] = i; /* 将皇后摆到当前循环到的位置 */  
  if(!check(n))  
      {             
            if(n == max - 1)  
                 {  
                   //show(); /* 如果全部摆好,则输出所有皇后的坐标 */  
                   sum++;
                  } 
     else {                                                                                                                put(n + 1); /* 否则继续摆放下一个皇后*/                                                                   }                                                                                                    }
}
return sum;                                                                                    }//double f(int jdouble *Adouble *B)
//{
// double sumand1 = 0;
// sumand1 = A[j]*B[j];
// return sumand1;
//}
void main(int argcchar **argv)  
{  
    int numtasks                   //进程总数  
         taskid                    //进程标识  
         numworkers                //从进程数目  
         source                    //消息源  
         dest                      //消息目的地  
         nbytes  
         mtype                     //消息类型  
         rows                       
         averowextraoffset       //从进程所分的行数  
         ijkt  
         count;
 int n;  
   double A[impossible]B[impossible];
   double C;  
   //long long C;//C[N][N];  
   double sumand ;           //求的乘积矩阵的所有元素的和  
   double starttimeendtime;  
   MPI_Init(&argc&argv);   // 初始化MPI环境  
   MPI_Comm_rank(MPI_COMM_WORLD&taskid);//标识各个MPI进程 ,告诉调用该函数进程的当前进程号  
   MPI_Comm_size(MPI_COMM_WORLD&numtasks);//用来标识相应进程组中有多少个进程  
   numworkers = numtasks-1;     //从进程数目  
  
/* 程序采用主从模式,以下为主进程程序 */  
     
if(taskid==MASTER)  
{  
starttime = MPI_Wtime();
sumand = 0;
   printf(“--------主进程开始对矩阵A、B初始化\n“);  
    //对A矩阵B矩阵 进行初始化赋值
    n = 0;
    for(i=0;i    {  
for(j = 0;j    {
if(abs(i-j)>1)
{
            A[n] = i;  
            B[n]= j;
n = n+1;
}
}  
    }  
   printf(“--------主

评论

共有 条评论