C语言实现,解决八皇后问题

《c和指针》上的一道题,对提示中的回溯算法不太明白,等有时间了好好看看。自己整的一个递归的解,繁琐一点,但是是正解,回头也再优化下。

 

 

流程图

代码

 

<pre name="code" class="cpp">/* CheckNqueens.c */

#include <stdio.h>

#define DIM 8
#define NUM 8

static int array[DIM][DIM]; // 0 --> OK, 1 --> Queen, -1 --> not OK;

static void CopyIntArray(int * t, const int * s, int num); //copy int array from s to t;
static int IsOk(int pos);  //is previous queen affected: 1 Not, 0 Yes
static void AddNotOkPos(int pos);
static void PrintArray();

int CheckNqueens(int pos)
{
	static int count;     // count for solutions
	static int numok;     // count for queen positions, if == 8, to print chessboard;
	int temp[DIM][DIM];
	CopyIntArray(&temp[0][0], &array[0][0], DIM*DIM);
	
	while( pos < DIM*DIM ){
		
		int x, y;
		x = pos / DIM;
		y = pos % DIM;

		if(array[x][y] != -1)
			if(IsOk(pos)){
				
				array[x][y] = 1;
				AddNotOkPos(pos);
				
				if(++ numok == NUM){
					PrintArray();
					count++;	
				}else
					CheckNqueens(pos+1);
				
				numok--;
				CopyIntArray(&array[0][0],&temp[0][0],DIM*DIM);
			}
		
		pos++;		
	}
	
	return count;
	
}

void CopyIntArray(int * t, const int * s, int num)
{
	int i = 0;
	while(i++<num)
		*t++ = *s++;	
}


/*  int IsOk(int pos);
		while(calculating affected position in array == 1)
	 			return 0;
			return 1;
*/
int IsOk(int pos)
{
	
	
	int x,y,i,j;
	x = pos / DIM;
	y = pos % DIM;
	
	//horizontal;
	i = 0, j = y;
	while(i < DIM)
		if(array[i++][j]== 1)
			return 0;
	//vertical;
	i = x, j = 0;
	while(j < DIM)
		if(array[i][j++]== 1)
			return 0;
	//upper left		
	i = x, j = y;
	while( i >= 0 && j >= 0)
		if(array[i--][j--]== 1)
			return 0;
	
	//upper right
	i = x, j = y;
	while( i < DIM && j >= 0)
		if(array[i++][j--]== 1)
			return 0;
	
	//lower left
	i = x, j = y;
	while( i >= 0 && j < DIM)
		if(array[i--][j++]== 1)
			return 0;
			
	//lower right
	i = x, j = y;
	while( i < DIM && j < DIM)
		if(array[i++][j++]== 1)
			return 0;
	
	return 1;	
}

/* calculting each affected position in array = -1 */
void AddNotOkPos(int pos)
{
	int x,y,i,j;
	x = pos / DIM;
	y = pos % DIM;
	
	//horizontal;
	i = 0, j = y;
	while(i < DIM)
		array[i++][j] = -1;
	
	//vertical;
	i = x, j = 0;
	while(j < DIM)
		array[i][j++] = -1;

	//upper left		
	i = x, j = y;
	while( i >= 0 && j >= 0)
		array[i--][j--] = -1;
	
	//upper right
	i = x, j = y;
	while( i < DIM && j >= 0)
		array[i++][j--] = -1;
	
	//lower left
	i = x, j = y;
	while( i >= 0 && j < DIM)
		array[i--][j++] = -1;
			
	//lower right
	i = x, j = y;
	while( i < DIM && j < DIM)
		array[i++][j++] = -1;
	
	array[x][y] = 1;	
}

//to print the chessboard available
void PrintArray()
{
	int i, j;
	for(i = 0; i < DIM; i++){
		for(j = 0; j < DIM; j++)
			if(array[i][j] == 1)
				putchar('O');
			else
				putchar('*');
		putchar('\n');
	}
	putchar('\n');			
}	

 


 

 

 

 

 

 

 

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值