亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? alpha_beta.cpp

?? 對樹剪枝算法
?? CPP
字號:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define		MAX_INT	 32767		//定義最大整數(shù)
#define		MIN_INT -32768		//定義最小整數(shù)
#define		MAX			 1		//極大層節(jié)點(diǎn)標(biāo)志
#define		MIN			 0		//極小層節(jié)點(diǎn)標(biāo)志

//以下結(jié)構(gòu)定義了樹結(jié)構(gòu)的一個(gè)節(jié)點(diǎn)。
//樹結(jié)構(gòu)的表示如下:
//每個(gè)節(jié)點(diǎn)指向其父節(jié)點(diǎn)
//每個(gè)節(jié)點(diǎn)指向其子節(jié)點(diǎn)鏈表
//一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn),形成一個(gè)兄弟鏈表,其父節(jié)點(diǎn)指向該兄弟鏈表的第一個(gè)
//節(jié)點(diǎn),但是兄弟鏈表中的每個(gè)節(jié)點(diǎn),都指向其父節(jié)點(diǎn)
struct NODE
{
	char name[10];			//節(jié)點(diǎn)名
	int value;				//節(jié)點(diǎn)的值
	int level;				//節(jié)點(diǎn)處在極大層,還是極小層
	struct NODE *pFrom;		//該節(jié)點(diǎn)的值來自于哪個(gè)子節(jié)點(diǎn)
	struct NODE *pFather;	//指向父節(jié)點(diǎn)
	struct NODE *pChildren; //指向子節(jié)點(diǎn)鏈表
	struct NODE *pNext;		//指向兄弟鏈表的下一個(gè)節(jié)點(diǎn)
};

//動(dòng)態(tài)產(chǎn)生一個(gè)節(jié)點(diǎn)
struct NODE *NewNode(char *name, int level)
{
	struct NODE *pNode = NULL;
	pNode = (NODE*)malloc(sizeof(struct NODE));
	if (pNode == NULL) return NULL;
	strcpy(pNode->name, name);
	if (level == MAX) 
	{
		pNode->value = MIN_INT;
	}
	else 
	{
		pNode->value = MAX_INT;
	}
	pNode->level = level;
	pNode->pFrom = NULL;
	pNode->pFather = NULL;
	pNode->pChildren = NULL;
	pNode->pNext = NULL;
	return pNode;
}
//從已經(jīng)建立的樹中,查找給定名字的節(jié)點(diǎn),并返回指向該節(jié)點(diǎn)的指針 
struct NODE *Search(char *name, struct NODE *pTree)
{
	struct NODE *pNode = NULL;
	if (pTree == NULL) return NULL;
	if (! strcmp(name, pTree->name)) return pTree;	//如果根節(jié)點(diǎn)就是待查找的節(jié)點(diǎn),則返回該節(jié)點(diǎn)
	if (pNode = Search(name, pTree->pNext))	//否則從該節(jié)點(diǎn)的兄弟節(jié)點(diǎn)中遞歸查找
	{
		return pNode;	//如果找到,則返回該節(jié)點(diǎn)
	}
	if (pNode = Search(name, pTree->pChildren))	//否則在子節(jié)點(diǎn)中遞歸查找
	{
		return pNode;	//如果找到則返回該節(jié)點(diǎn)
	}
	return NULL;	//以上均找不到的話則返回NULL
}

//從一個(gè)文本文件中讀入一個(gè)樹
struct NODE *ReadTree(FILE *pFile)
{
	char name[256];
	int value;
	struct NODE *pNode = NULL, *pRoot = NULL, *pFNode = NULL, *pLast = NULL;

	//在樹文件中,尋找ROOT標(biāo)志
	while (!feof(pFile))
	{
		fscanf(pFile, "%s", name);
		if (feof(pFile)) return NULL;
		if (! strcmp(name, "ROOT")) break;
	}

	fscanf(pFile, "%s", name);	//得到根節(jié)點(diǎn)名字
	pRoot = NewNode(name, MAX);	//建立根節(jié)點(diǎn)
	if (pRoot == NULL) return NULL;	//如果空間不夠則返回NULL

	//讀文本文件,建立樹結(jié)構(gòu)
	while (!feof(pFile))
	{
		fscanf(pFile, "%s", name);	//name得到父節(jié)點(diǎn)名字
		if (feof(pFile)) return NULL;
		if (! strcmp(name, "VALUE")) break;
		pFNode = Search(name, pRoot);	//得到父節(jié)點(diǎn)在樹中的指針
		if (pFNode == NULL) return NULL;	//如果樹中不存在該節(jié)點(diǎn)則返回NULL

		pLast = NULL;

		//讀子節(jié)點(diǎn),建立父子關(guān)系和兄弟關(guān)系
		while (!feof(pFile))
		{
			fscanf(pFile, "%s", name);	//得到子節(jié)點(diǎn)名
			if (feof(pFile)) return NULL;
			if (! strcmp(name, "END")) break;
			pNode = NewNode(name, !pFNode->level);	//建立子節(jié)點(diǎn)
			if (pNode == NULL) return NULL;	//空間不夠用時(shí)返回NULL

			if (pLast == NULL)	//如果是第一個(gè)子節(jié)點(diǎn),其父節(jié)點(diǎn)指向該節(jié)點(diǎn)
			{
				pFNode->pChildren = pNode;
			}
			else
			{
				pLast->pNext = pNode;	//否則將該節(jié)點(diǎn)鏈接到兄弟鏈表中
			}
			pLast = pNode;
			pNode->pFather = pFNode;	//設(shè)置該節(jié)點(diǎn)的父節(jié)點(diǎn)
		}
	}

	//為葉節(jié)點(diǎn)賦初始估計(jì)值
	while (!feof(pFile))
	{
		fscanf(pFile, "%s", name);	//得到葉節(jié)點(diǎn)名
		if (feof(pFile)) return NULL;
		if (! strcmp(name, "END")) break;	//END為結(jié)束標(biāo)志
		fscanf(pFile, "%d", &value);	//得到葉節(jié)點(diǎn)的初始估計(jì)值
		if (feof(pFile)) return NULL;
		pNode = Search(name, pRoot);	//從樹中得到該節(jié)點(diǎn)的指針
		if (pNode == NULL) return NULL;	//如果樹中沒有該節(jié)點(diǎn),則返回NULL
		pNode->value = value;	//為該節(jié)點(diǎn)賦初始估計(jì)值
	}

	return pRoot;	//返回樹根節(jié)點(diǎn)
}

//顯示信息
void PrintTreeRoot(struct NODE *pRoot)
{
	if (pRoot == NULL) 
		return;	
	printf("根節(jié)點(diǎn): %s\n", pRoot->name);	//顯示根節(jié)點(diǎn)的名字
	printf("倒推值: %d\n", pRoot->value);
	printf("應(yīng)走的步驟: %s\n", pRoot->pFrom->name);
}

//釋放動(dòng)態(tài)產(chǎn)生的樹 
void FreeTree(struct NODE *pRoot)
{
	struct NODE *pChildren = NULL, *pNext = NULL;
	if (pRoot == NULL) return;
	pChildren = pRoot->pChildren;
	pNext = pRoot->pNext;
	free(pRoot);	//釋放根節(jié)點(diǎn)
	FreeTree(pChildren);	//遞歸釋放根節(jié)點(diǎn)的子節(jié)點(diǎn)
	FreeTree(pNext);	//遞歸釋放根節(jié)點(diǎn)的兄弟節(jié)點(diǎn)
}

//判斷在給定的節(jié)點(diǎn)處是否可以發(fā)生剪枝
int CutP(struct NODE *pNode)
{
	int value;
	int level;

	if (pNode == NULL) return 0;
	value = pNode->value;
	level = pNode->level;
	//printf("First : %s\n" , pNode->name);
	
	while (pNode)
	{
		if(pNode->pFather == NULL)
		{
			//printf("pNode->pFather == NULL\n");
			return 0;
		}
		pNode = pNode->pFather;			
		if(level == MAX)
		{	
			//printf("level == MAX\n");
			while(pNode->pFather != NULL && (pNode->value == MAX_INT || pNode->value == MIN_INT))
			{
				//printf("MAX:pNode->name : %s\n", pNode->name);
				pNode = pNode->pFather;
			}
			if(pNode->level == MIN && value >= pNode->value)
			{
				//printf("CUT:%d\n",value);
				//printf("CUT:%d\n",pNode->value);
				//printf("CUT\n");
				return 1;
			}
			//else
			//{
				//printf("NOT:%s\n",pNode->name);
				//printf("NOT:%d\n",value);
				//printf("NOT:%d\n",pNode->value);
				//printf("NOT CUT\n");
				return 0;
			//}
			/*while(pNode!= NULL && pNode->level == MIN && value >= pNode->value && pNode->value!= MIN_INT)
			{
				return 1;
				pNode = pNode->pFather;
			}*/
		}
		if(level == MIN)
		{
			//printf("level == MIN\n");
			while(pNode->pFather != NULL && (pNode->value == MAX_INT || pNode->value == MIN_INT))
			{
				//printf("MIN:pNode->name : %s\n", pNode->name);
				pNode = pNode->pFather;
			}
			if(pNode->level == MAX && value <= pNode->value)
			{
				//printf("%s\n",pNode->level);
				//printf("CUT:%d\n",value);
				//printf("CUT:%d\n",pNode->value);
				//printf("CUT\n");
				return 1;
			}
			else 
			{
				//printf("NOT:%s\n",pNode->name);
				//printf("NOT:%d\n",value);
				//printf("NOT:%d\n",pNode->value);
				//printf("NOT CUT\n");
				return 0;
			}
			/*while(pNode!= NULL && pNode->level == MAX && value <= pNode->value && pNode->value != MAX_INT)
			{
				return 1;
				pNode = pNode->pFather;
			}*/
		}
		//pNode = pNode->pFather;
		/*if (pNode == NULL) return 0;

		if (pNode->value == MAX_INT ||
			pNode->value == MIN_INT)
		{
			return 0;	//如果祖先節(jié)點(diǎn)還沒有值,則不發(fā)生剪枝
		}

		if (level == MAX)	//對于極大節(jié)點(diǎn)
		{		
			if (value >= pNode->value)  //如果當(dāng)前值大于其祖先極小節(jié)點(diǎn)的值
			{
				return 1;	//則發(fā)生剪枝
			}
		}
		else	//對于極小節(jié)點(diǎn)
		{
			if (value <= pNode->value)	//如果當(dāng)值小于其祖先極大節(jié)點(diǎn)的值
			{
				return 1;	//則發(fā)生剪枝
			}
		}
		pNode = pNode->pFather;*/
	}	
	return 0;
}

//打印剪枝
void Cut(struct NODE *pNode, struct NODE *pChildren)
{
	printf("剪枝 %s: ", pNode->name);
	while (pChildren)
	{
		printf("%s ", pChildren->name);
		pChildren = pChildren->pNext;
	}
	printf("\n");
}

//Alpha_Beta剪枝主函數(shù)
int Alpha_Beta(struct NODE *pRoot)
{
	struct NODE *pNode = NULL;
	int value;

	//如果根節(jié)點(diǎn)沒有子節(jié)點(diǎn),則其值就是該節(jié)點(diǎn)的指
	if (pRoot->pChildren == NULL)
	{
		return pRoot->value;
	}

	pNode = pRoot->pChildren;	
	while (pNode)
	{
		value = Alpha_Beta(pNode);	//對于根節(jié)點(diǎn)的子節(jié)點(diǎn),遞歸計(jì)算其值
		if (pRoot->level == MAX)	//對于極大節(jié)點(diǎn)
		{
			if (value > pRoot->value)	//如果子節(jié)點(diǎn)的值大于當(dāng)前節(jié)點(diǎn)的值 
			{
				pRoot->value = value;	//則用其子節(jié)點(diǎn)的值代替
				pRoot->pFrom = pNode;	//標(biāo)記該值的出處
				if (pNode->pNext && CutP(pRoot))	//如果其子節(jié)點(diǎn)還有沒有擴(kuò)展的兄弟節(jié)點(diǎn)
													//并且當(dāng)前節(jié)點(diǎn)滿足剪枝條件
				{
					Cut(pRoot, pNode->pNext);	//則進(jìn)行剪枝
					//printf("CUT MAX : %s\n", pNode->pFather->name);//debug
					return value;	//返回得到的值
				}
			}
		}
		else	//對于極小節(jié)點(diǎn)
		{
			if (value < pRoot->value)	//如果子節(jié)點(diǎn)的值小于當(dāng)前節(jié)點(diǎn)的值
			{
				pRoot->value = value;	//則用其子節(jié)點(diǎn)的值代替
				pRoot->pFrom = pNode;	//標(biāo)記該值的出處
				if (pNode->pNext && CutP(pRoot))	//如果其子節(jié)點(diǎn)還有沒有擴(kuò)展的兄弟節(jié)點(diǎn)
													//并且當(dāng)前節(jié)點(diǎn)滿足剪枝條件
				{
					Cut(pRoot, pNode->pNext);	//則進(jìn)行剪枝
					//printf("CUT MIN : %s\n", pNode->pFather->name);//debug
					return value;	//返回得到的值
				}
			}
		}
		pNode = pNode->pNext;	//試探下一個(gè)兄弟節(jié)點(diǎn)
	}
	return pRoot->value;
}

void main(void)
{
	FILE *pFile;
	struct NODE *pRoot;

	char filename[10];
	scanf("%s",filename);
	pFile = fopen(filename, "r");
	if (pFile == NULL)
	{
		printf("文件打開錯(cuò)誤!\n");
	}
	else
	{
		pRoot = ReadTree(pFile);	//從文件中讀入樹結(jié)構(gòu)
		fclose(pFile);
		if (pRoot == NULL)
		{
			printf("讀數(shù)據(jù)文件錯(cuò)誤!\n");
		}
		else
		{
			Alpha_Beta(pRoot);	//對該樹進(jìn)行Alpha_Beta剪枝
			PrintTreeRoot(pRoot);
			FreeTree(pRoot);	//釋放動(dòng)態(tài)產(chǎn)生的樹
		}
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩欧美精品综合| 综合激情网...| 一本在线高清不卡dvd| 裸体歌舞表演一区二区| 成人欧美一区二区三区黑人麻豆| 日韩一区二区三区高清免费看看 | 国产91丝袜在线18| 亚洲高清免费视频| 亚洲日本韩国一区| 欧美激情中文字幕| 精品伦理精品一区| 欧美日韩一区二区欧美激情| www.久久久久久久久| 韩国精品主播一区二区在线观看| 亚洲国产一区二区在线播放| 中文字幕第一区二区| 日韩精品在线网站| 欧美日本视频在线| 色菇凉天天综合网| 97精品电影院| 东方欧美亚洲色图在线| 国内精品伊人久久久久av影院| 日韩精品乱码av一区二区| 亚洲欧美色综合| 中文字幕五月欧美| 国产精品看片你懂得| 久久久久久久国产精品影院| 日韩视频一区二区三区在线播放| 欧美亚洲国产怡红院影院| 91在线一区二区| 国产成人三级在线观看| 国内不卡的二区三区中文字幕| 奇米影视一区二区三区| 石原莉奈一区二区三区在线观看| 亚洲一卡二卡三卡四卡| 亚洲综合色视频| 亚洲成人av在线电影| 亚洲成人高清在线| 日韩影院免费视频| 亚洲成a人片在线不卡一二三区| 亚洲老妇xxxxxx| 亚洲欧洲制服丝袜| 一区二区三区中文字幕电影 | 欧美极品aⅴ影院| 国产色91在线| 中文字幕免费观看一区| 国产精品三级av在线播放| 国产精品久久久久久亚洲伦 | 亚洲综合一区二区精品导航| 亚洲综合一区二区| 日韩中文欧美在线| 狠狠v欧美v日韩v亚洲ⅴ| 国产福利电影一区二区三区| 成人福利在线看| 91论坛在线播放| 欧美色手机在线观看| 欧美高清精品3d| 精品精品国产高清a毛片牛牛 | 婷婷激情综合网| 日本美女视频一区二区| 麻豆成人在线观看| 国产成人av一区二区| 99久久99久久精品免费观看 | 欧美三级中文字幕| 日韩欧美第一区| 国产欧美日韩亚州综合| 最新日韩在线视频| 日韩中文字幕91| 国产精品1区2区3区| 色94色欧美sute亚洲线路一ni | 国产精品亚洲人在线观看| 成人ar影院免费观看视频| 色婷婷久久久久swag精品| 欧美伦理电影网| 国产午夜精品理论片a级大结局 | 7777精品伊人久久久大香线蕉超级流畅 | 国产精品伦一区| 亚洲综合激情另类小说区| 美女视频一区二区| 99久久国产综合精品女不卡| 91精品国产综合久久精品| 欧美经典一区二区三区| 亚洲高清久久久| 国产成人av电影在线| 欧美最猛黑人xxxxx猛交| 久久久九九九九| 性做久久久久久久免费看| 国产成人av资源| 制服丝袜亚洲网站| 亚洲人成网站在线| 久久99精品国产麻豆婷婷| 99精品黄色片免费大全| 日韩午夜中文字幕| 一区二区三区久久久| 国产综合久久久久久鬼色| 在线看一区二区| 日本一区二区三区国色天香| 婷婷久久综合九色综合绿巨人| 成人免费观看男女羞羞视频| 91精品国产手机| 一区二区三区小说| 成人亚洲一区二区一| 制服丝袜成人动漫| 一区二区三区中文字幕电影| 丁香六月久久综合狠狠色| 欧美一级片免费看| 亚洲自拍另类综合| 91在线观看一区二区| www一区二区| 日本欧美大码aⅴ在线播放| 色噜噜狠狠一区二区三区果冻| 久久久无码精品亚洲日韩按摩| 亚洲大片在线观看| 色欧美片视频在线观看| 国产精品毛片久久久久久久| 国产综合久久久久久鬼色| 精品视频一区二区不卡| 亚洲欧美经典视频| 成人综合日日夜夜| 久久色成人在线| 久久超碰97中文字幕| 欧美一区二区三区在线| 亚洲不卡一区二区三区| 色婷婷av一区二区三区大白胸| 国产精品乱人伦一区二区| 国产一区二区三区香蕉| 精品日韩欧美在线| 美腿丝袜亚洲色图| 欧美一区二区福利在线| 日本伊人午夜精品| 欧美美女黄视频| 日韩成人一级片| 欧美人动与zoxxxx乱| 亚洲午夜久久久| 欧美色综合天天久久综合精品| 亚洲男人天堂av| 欧美专区日韩专区| 亚洲一区二区美女| 欧美色区777第一页| 丝袜美腿亚洲色图| 欧美精品一级二级三级| 日本三级韩国三级欧美三级| 91精品国产综合久久精品图片| 日韩国产在线观看一区| 精品国产sm最大网站免费看| 国精品**一区二区三区在线蜜桃| 26uuu色噜噜精品一区| 国产又黄又大久久| 国产日产亚洲精品系列| 成人av网址在线| 亚洲精品你懂的| 欧美久久一二区| 精品在线你懂的| 欧美国产精品一区二区| 一本色道久久综合亚洲91| 亚洲综合视频网| 日韩亚洲国产中文字幕欧美| 国产精品自拍网站| 亚洲色图一区二区| 欧美三级中文字幕| 久99久精品视频免费观看| 国产人成亚洲第一网站在线播放| 成人性生交大片免费看中文网站| 亚洲天堂免费看| 欧美精品在线观看播放| 国内不卡的二区三区中文字幕 | 精品中文字幕一区二区| 国产精品灌醉下药二区| 欧美三级中文字| 国产精品一区二区久久不卡| |精品福利一区二区三区| 欧美日本不卡视频| 国产精品综合在线视频| 亚洲黄色小说网站| 欧美一级高清大全免费观看| 国产精品资源在线看| 亚洲一区在线电影| 精品久久国产字幕高潮| 97超碰欧美中文字幕| 喷水一区二区三区| 国产精品嫩草影院com| 欧美一区二区日韩| 99这里都是精品| 免费一级片91| 亚洲三级视频在线观看| 日韩视频在线永久播放| 91视频免费看| 精彩视频一区二区| 性久久久久久久| 中文字幕日韩欧美一区二区三区| 欧美一区二区不卡视频| 99久久伊人久久99| 久久精品国产亚洲5555| 一区二区三区在线视频免费 | 91福利区一区二区三区| 国产在线视频不卡二| 亚洲第一成人在线| 亚洲色图视频免费播放| 久久精品综合网| 这里只有精品免费|