Linux多线程:多线程判断数独是否有效、实现归并排序

数独和归并分别表示了 无参数传递 和 有参数传递 的情况

一、判断数独是否有效:

#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]);
}

 

 

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼卡尼卡尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值