数独和归并分别表示了 无参数传递 和 有参数传递 的情况
一、判断数独是否有效:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int judgeRow(int row);//判断行
int judgeCol(int col);//判断列
int judgeLump(int row, int col);//判断九宫格
int inputData1(char *as);//文件导入数据
int inputData2();//直接导入数据
void *runner1(void* arg);//线程1,处理行
void *runner2(void* arg);//线程2,处理列
void *runner3(void* arg);//线程3,处理九宫格
void print();//打印数据
int data[9][9];
int i,j;
int main(int argc, char** args){
int res1,res2;
char *filename;
char choice;
int res[3];
//第一步导入数据
if(argc!=2){
printf("请选择输入数据方式:\n1.文件导入 2.手动输入\n");
choice = getchar();
if (choice == '1'){
printf("请输入文件名:\n");
scanf("%s",filename);
res1=inputData1(filename);
}else{
res1=inputData2();
}
}else{
res1=inputData1(args[1]);
}
print();
//第二步:判断数独是否构成解
pthread_t tid1; //线程id
pthread_t tid2;
pthread_t tid3;
pthread_create(&tid1,NULL,runner1,NULL);
pthread_create(&tid2,NULL,runner2,NULL);
pthread_create(&tid3,NULL,runner3,NULL);
pthread_join(tid1,NULL);//等待线程结束
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
return 0;
}
int inputData1(char as[]){
FILE *fin = fopen(as,"r");
if (!fin){printf("导入数据失败!\n");return 0;}
for (i = 0;i<9;i++)
for (j=0;j<9;j++)
fscanf(fin, "%d", &data[i][j]);
printf("数据导入完毕!");
return 1;
}
int inputData2() {
printf("请输入数独:\n");
for (i=0;i<9;i++)
for (j=0;j<9;j++)
scanf("%d",&data[i][j]);
printf("数据导入完毕!");
return 1;
}
void print(){
printf("数据内容:\n");
for (i=0;i<9;i++){
for (j=0;j<9;j++){
printf("%d ",data[i][j]);
}
printf("\n");
}
}
void *runner1(void* arg){
int a,b;
for (a=0;a<9;a++){
int flag[10]={0,0,0,0,0,0,0,0,0,0};
for (b=0;b<9;b++){
if (flag[data[a][b]]==0){
flag[data[a][b]]=1;
}else if(flag[data[a][b]]==1){
printf("%d 行不满足\n",a);
pthread_exit(0);
}
}
}
printf("行满足\n");
pthread_exit(0);
}
void *runner2(void* arg){
int a,b;
for (a=0;a<9;a++){
int flag[10]={0,0,0,0,0,0,0,0,0,0};
for (b=0;b<9;b++){
if (flag[data[b][a]]!=1){
flag[data[b][a]]=1;
}else if(flag[data[a][b]]==1){
printf("%d 列不满足\n",a);
pthread_exit(0);
}
}
}
printf("列满足\n");
pthread_exit(0);
}
void *runner3(void* arg){
int x,y,a,b;
for (x=0;x<9;x+=3){
for (y=0;y<9;y+=3){
int flag[10]={0,0,0,0,0,0,0,0,0,0};
for (a=0;a<3;a++){
for (b=0;b<3;b++){
if (flag[data[x+a][y+b]]!=1){
flag[data[x+a][y+b]]=1;
}else if(flag[data[x+a][y+b]]==1){
printf("九宫格不满足\n");
pthread_exit(0);
}
}
}
}
}
printf("九宫格满足\n");
pthread_exit(0);
}
二、多线程归并排序:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#define maxsize 10
int Data[maxsize];//待排序数据
int Left[maxsize], Right[maxsize];//辅助排序数组
void MergerSort(int left, int centrl, int right);//实现递归分治
void Msort(int left, int centrl, int right);//实现数组有序合并
void *runnerL(void* args);//左分治线程
void *runnerR(void* args);//右分治线程
int main()
{
int num;
int i;
printf("输入元素个数:\n");
scanf("%d",&num);
printf("输入依次输入每个元素:\n");
for (i = 0; i < num; i++)
scanf("%d",&Data[i]);
MergerSort(0, (num - 1) / 2, num - 1);
printf("排序后结果:\n");
for (i = 0; i < num; i++)
printf("%d ",Data[i]);
printf("\n");
return 0;
}
void MergerSort(int left, int centrl, int right)
{
if (right - left >= 1)
{
int *sa = (int*)malloc(sizeof(int)*4);
sa[0]=left;sa[1]=centrl;sa[2]=right;//分治线程的参数
pthread_t tidL;
pthread_t tidR;
pthread_create(&tidL,NULL,runnerL,sa);
pthread_create(&tidR,NULL,runnerR,sa);
pthread_join(tidL,NULL);
pthread_join(tidR,NULL);
free(sa);
Msort(left, centrl, right);
}
}
void Msort(int left, int centrl, int right)
{
int i, LenLeft = 0, LenRight = 0;
int j, cur = 0;
for (i = left; i <= centrl; i++)Left[LenLeft++] = Data[i];
Left[LenLeft] = maxsize;
for (i = centrl + 1; i <= right; i++)Right[LenRight++] = Data[i];
Right[LenRight] = maxsize;
i = 0; j = 0;
while (i < LenLeft || j < LenRight)
{
if (Left[i] <= Right[j])
Data[left + cur++] = Left[i++];
else
Data[left + cur++] = Right[j++];
}
}
void *runnerL(void* args){
int *pt = (int*)args;
MergerSort(pt[0], (pt[1] + pt[0]) / 2, pt[1]);
}
void *runnerR(void* args){
int *pt = (int*)args;
MergerSort(pt[1] + 1, (pt[2] + pt[1] + 1) / 2, pt[2]);
}