资源简介
通过减少问题规模形式,做并行计算,求解把皇后及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(“--------主
评论
共有 条评论