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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? basic_go_types.h

?? uct算法
?? H
字號:
#ifndef _BASIC_GO_TYPES_H_#define _BASIC_GO_TYPES_H_/* * 包含了基本的Player,Color,coord,Vertex,Move類 *///------------------------------------------------------------------------------/* * Player,使用位運算加速計算另一方:other *///Playernamespace player {	//typedef uint t;	enum t{ black = 1, white = 2, wrong = 3};	const uint cnt = 3;	inline t other(t pl) {		//return t(pl ^ 3);//TODO: 究竟是位運算快還是if else快?		if(pl == black) return white;		else return black;	}	inline bool in_range(t pl) {		return pl < wrong;	}	inline t operator++(t& pl) { return (pl = t(pl+1)); }	inline void check(t pl) {		assertc (player_ac, (pl & (~1)) == 0);	}};typedef player::t Player;// faster than non-loop#define player_for_each(pl) \	for (Player pl = player::black; player::in_range(pl); ++pl)//------------------------------------------------------------------------------/* * Color與Player對應,但是多了幾種狀態 * */// class colornamespace color {	typedef uint t;	enum {		empty = 0, 		black = 1, 		white = 2, 		off_board = 3, 		wrong = 4	};	const int is_player_map[] = {		0,1,1,0,0	};	const int not_player_map[] = {		1,0,0,1,1	};	const int cnt = 4;	inline void check(t cl) {		assertc (color_ac, (cl & (~3)) == 0); 	}	inline bool is_player(t cl) {		//return cl <= white;		//return cl > 0;		return is_player_map[cl]; 	}	inline bool is_not_player(t cl) {		//return cl > white;		//return cl == 0;		return not_player_map[cl]; 	}	inline t from_player(Player pl) {		return (t)(pl);	}	inline Player to_player(t cl) {		return (Player)(cl);	}	inline bool in_range(t cl) {		return cl < cnt;	}	//inline t operator++(t& pl) { return (pl = t(pl+1));}}typedef color::t Color;// TODO test it for performance#define color_for_each(col) \	for (Color col = 0; color::in_range(col); ++col)/* * 坐標類,坐標由兩個int值表示,-1表示棋盤外的坐標 */namespace coord { // TODO class	typedef int t;	template<uint T> bool is_ok (t coord) { return (coord < int (T)) & (coord >= -1); }	template<uint T> bool is_on_board (t coord) { return uint (coord) < T; }	template<uint T> void check (t coo) { 		unused (coo);		assertc (coord_ac, is_ok<T> (coo)); 	}	template<uint T> void check2 (t row, t col) { 		if (!coord_ac) return;		if (row == -1 && col == -1) return;		assertc (coord_ac, is_on_board<T> (row)); 		assertc (coord_ac, is_on_board<T> (col)); 	}}#define coord_for_each(rc) \	for (coord::t rc = 0; rc < int(T); rc++)//for (coord::t rc = 0; rc < int(T); rc = coord::t (rc+1))//--------------------------------------------------------------------------------/* * 棋盤上的交叉點,參數T是棋盤大小,用一個uint存儲 */template<uint T> class Vertex {	//static_assert (cnt <= (1 << bits_used));	//static_assert (cnt > (1 << (bits_used-1)));	uint idx;public:	const static uint dNS = (T + 2);	const static uint dWE = 1;	const static uint bits_used = 9;     // on 19x19 cnt == 441 < 512 == 1 << 9;	const static uint pass_idx = 0;	const static uint any_idx  = 1; // TODO any	const static uint resign_idx = 2;	const static uint cnt = (T + 2) * (T + 2);	explicit Vertex () { } // TODO is it needed	explicit Vertex (uint _idx) { idx = _idx; }	operator uint() const { return idx; }	bool operator== (Vertex other) const { return idx == other.idx; }	bool operator!= (Vertex other) const { return idx != other.idx; }	bool in_range ()          const { return idx < cnt; }	Vertex& operator++() { ++idx; return *this;}	void check ()             const { assertc (vertex_ac, in_range ()); }	coord::t row () const { return idx / dNS - 1; }	coord::t col () const { return idx % dNS - 1; }	//TODO:this usualy can be achieved quicker by color_at lookup	bool is_on_board () const {		return coord::is_on_board<T> (row ()) & coord::is_on_board<T> (col ());	}	void check_is_on_board () const { 		assertc (vertex_ac, is_on_board ()); 	}	Vertex N () const { return Vertex (idx - dNS); }	Vertex W () const { return Vertex (idx - dWE); }	Vertex E () const { return Vertex (idx + dWE); }	Vertex S () const { return Vertex (idx + dNS); }	/*	   Vertex NW () const { return N ().W (); } // TODO can it be faster?	   Vertex NE () const { return N ().E (); } // only Go	   Vertex SW () const { return S ().W (); } // only Go	   Vertex SE () const { return S ().E (); }	   */	Vertex NW () const { return Vertex (idx - dNS - dWE); }	Vertex NE () const { return Vertex (idx - dNS + dWE); }	Vertex SW () const { return Vertex (idx - dWE + dNS); }	Vertex SE () const { return Vertex (idx + dWE + dNS); }	static Vertex pass   () { return Vertex (Vertex::pass_idx); }	static Vertex any    () { return Vertex (Vertex::any_idx); }	static Vertex resign () { return Vertex (Vertex::resign_idx); }	// TODO make this constructor a static function	/*	   Vertex (coord::t r, coord::t c) {	   coord::check2<T> (r, c);	   idx = (r+1) * dNS + (c+1) * dWE;	   }	   */	static Vertex of_coords(coord::t r, coord::t c) {		coord::check2<T> (r, c);		return Vertex((r+1) * dNS + (c+1) * dWE);	}};#define vertex_for_each_all(vv) \	for (Vertex<T> vv = Vertex<T>(0); vv.in_range (); ++vv) // TODO 0 works??? // TODO player the same way!// misses some offboard vertices (for speed) #define vertex_for_each_faster(vv)                                  \	for (Vertex<T> vv = Vertex<T>(Vertex<T>::dNS+Vertex<T>::dWE);                 \		vv <= T * (Vertex<T>::dNS + Vertex<T>::dWE);   \	++vv)#define vertex_for_each_far_nbr(center_v, d, nbr_v, block) { \	Vertex<T> nbr_v; \	Vertex<T> vv1,vv2;\	coord::t row = center_v.row();\	coord::t col = center_v.col();\	coord::t left = max(col - d, 0);\	coord::t right = min(col + d, int(T) - 1);\	coord::t top = max(row - d, 0);\	coord::t bottom = min(row + d, int(T) - 1);\	Vertex<T> tl = Vertex<T>::of_coords(top, left);\	Vertex<T> tr = Vertex<T>::of_coords(top, right);\	Vertex<T> bl = Vertex<T>::of_coords(bottom, left);\	Vertex<T> br = Vertex<T>::of_coords(bottom, right);\	for (vv1 = tl, vv2 = tr; vv1 <= bl; vv1 = vv1.S(), vv2 = vv2.S()) {\		for (nbr_v = vv1; nbr_v <= vv2; ++nbr_v) {\			block;\		}\	}\}/* * 鄰點 */#define vertex_for_each_nbr(center_v, nbr_v,i, block) {       \	center_v.check_is_on_board ();                      \	Vertex<T> nbr_v;                                    \	uint i;						\	nbr_v = center_v.N (); i=4;block;                       \	nbr_v = center_v.W (); i=6;block;                       \	nbr_v = center_v.S (); i=0;block;                       \	nbr_v = center_v.E (); i=2;block;                       \}/* * 鄰點(但是i為正序) */#define vertex_for_each_nbr2(center_v, nbr_v,i, block) {       \	center_v.check_is_on_board ();                      \	Vertex<T> nbr_v;                                    \	uint i;						\	nbr_v = center_v.N (); i=0;block;                       \	nbr_v = center_v.W (); i=2;block;                       \	nbr_v = center_v.S (); i=4;block;                       \	nbr_v = center_v.E (); i=6;block;                       \}/* * 對角鄰點 */#define vertex_for_each_diag_nbr(center_v, nbr_v, i, block) {      \	center_v.check_is_on_board ();                          \	Vertex<T> nbr_v;                                        \	uint i;						\	nbr_v = center_v.NW (); i=4;block;                          \	nbr_v = center_v.NE (); i=6;block;                          \	nbr_v = center_v.SE (); i=0;block;                          \	nbr_v = center_v.SW (); i=2;block;                          \}#define vertex_for_each_diag_nbr2(center_v, nbr_v, i, block) {      \	center_v.check_is_on_board ();                          \	Vertex<T> nbr_v;                                        \	uint i;						\	nbr_v = center_v.NW (); i=0;block;                          \	nbr_v = center_v.NE (); i=2;block;                          \	nbr_v = center_v.SE (); i=4;block;                          \	nbr_v = center_v.SW (); i=6;block;                          \}#define player_vertex_for_each_9_nbr(center_v, pl, nbr_v, i) {      \	v::check_is_on_board (center_v);                            \	Move    nbr_v;                                              \	player_for_each (pl) {                                      \		nbr_v = center_v;                                   \		i;                                                  \		vertex_for_each_nbr      (center_v, nbr_v, i);      \		vertex_for_each_diag_nbr (center_v, nbr_v, i);      \	}                                                           \}#define vertex_for_each_8_nbr(center_v, nbr_v, i, block) {      	    \	center_v.check_is_on_board ();                            \	Vertex<T> nbr_v;                                    \	uint i;						\	nbr_v = center_v.N (); i=0;block;                       \	nbr_v = center_v.W (); i=1;block;                       \	nbr_v = center_v.S (); i=0;block;                       \	nbr_v = center_v.E (); i=1;block;                       \	nbr_v = center_v.NW (); i=2;block;                          \	nbr_v = center_v.NE (); i=3;block;                          \	nbr_v = center_v.SE (); i=2;block;                          \	nbr_v = center_v.SW (); i=3;block;                          \}//--------------------------------------------------------------------------------/* * 用一個uint表示一次Move,即在Vertex前面再加上一個表示Player的bit */template<uint T> class Move {public:	//const static uint cnt = player::white << Vertex<T>::bits_used | Vertex<T>::cnt;	const static uint cnt = player::black << Vertex<T>::bits_used | Vertex<T>::cnt;	const static uint no_move_idx = 1;	uint idx;	void check () {		Player ((idx >> Vertex<T>::bits_used) + 1);		Vertex<T> (idx & ((1 << Vertex<T>::bits_used) - 1)).check ();	}	explicit Move (Player player, Vertex<T> v) { 		//idx = (player << Vertex<T>::bits_used) | v;		idx = ((player>>1) << Vertex<T>::bits_used) | v;	}	explicit Move () {		Move (player::black, Vertex<T>::any ());	}	explicit Move (int idx_) {		idx = idx_;	}	Player get_player () { 		return Player ((idx >> Vertex<T>::bits_used) + 1);	}	Vertex<T> get_vertex () { 		return Vertex<T> (idx & ((1 << ::Vertex<T>::bits_used) - 1)) ; 	}	operator uint() const { return idx; }	bool operator== (Move other) const { return idx == other.idx; }	bool operator!= (Move other) const { return idx != other.idx; }	bool in_range ()          const { return idx < cnt; }	Move& operator++() { ++idx; return *this;}};    #define move_for_each_all(m) for (Move m = Move (0); m.in_range (); ++m)/********************************************************************************/#endif // _BASIC_GO_TYPES_H_

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区电影在线观看| 国产成人鲁色资源国产91色综| 五月婷婷色综合| 国产精品亚洲成人| 在线日韩av片| 久久一日本道色综合| 国产精品久久久久9999吃药| 日本欧美一区二区| 色美美综合视频| 国产婷婷一区二区| 亚洲成人av免费| 99国产一区二区三精品乱码| 日韩一区二区精品在线观看| 亚洲视频电影在线| 国产成人av资源| 欧美一区二区三区视频免费播放 | 久久精品国产99国产| 91色婷婷久久久久合中文| 精品女同一区二区| 日韩av网站免费在线| 欧美午夜视频网站| 亚洲日本va午夜在线影院| 国产成人av电影在线播放| 精品国产髙清在线看国产毛片| 亚洲不卡在线观看| 色狠狠色噜噜噜综合网| 国产精品高潮呻吟| 国产乱国产乱300精品| 欧美一区二区三区视频在线| 石原莉奈在线亚洲三区| 欧美女孩性生活视频| 亚洲一区二区三区视频在线| 99久久国产免费看| 亚洲三级在线看| 91丨九色porny丨蝌蚪| 亚洲欧洲精品天堂一级| 成人伦理片在线| 国产精品剧情在线亚洲| 波多野结衣中文字幕一区二区三区| 久久麻豆一区二区| 国产伦精品一区二区三区免费迷 | 精品久久久久av影院| 精品在线免费视频| 久久久久久黄色| 国产精品原创巨作av| 国产亚洲欧美日韩日本| 成+人+亚洲+综合天堂| 最新高清无码专区| 在线观看免费亚洲| 日本美女一区二区三区视频| 日韩手机在线导航| 国产美女一区二区三区| 国产精品美女视频| 欧美综合色免费| 日韩中文字幕不卡| 久久综合色之久久综合| 国产成人免费9x9x人网站视频| 国产精品夫妻自拍| 欧美日韩一区不卡| 激情综合五月天| 中文字幕在线免费不卡| 日本福利一区二区| 另类调教123区| 欧美激情一区三区| 在线免费视频一区二区| 麻豆精品在线看| 久久精品一区二区| 日本二三区不卡| 国产一区二区三区久久久| 国产精品久久久久久久久果冻传媒 | 亚洲电影视频在线| 欧美精品一区二区精品网| 成人激情综合网站| 午夜视频久久久久久| 国产日韩亚洲欧美综合| 在线精品视频一区二区| 国产一区免费电影| 亚洲最大色网站| 国产无人区一区二区三区| 欧美嫩在线观看| 成人免费va视频| 日本欧美在线观看| 一区二区三区电影在线播| 精品国产乱码久久久久久牛牛| 97久久超碰国产精品| 热久久一区二区| 国产精品免费久久久久| 日韩美女主播在线视频一区二区三区| 国产 欧美在线| 老司机精品视频一区二区三区| 亚洲精品五月天| 久久久精品欧美丰满| 欧美日本不卡视频| 91视频观看视频| 成人蜜臀av电影| 国产精品亚洲第一区在线暖暖韩国| 亚洲一区在线视频| 日韩理论电影院| 久久蜜桃av一区精品变态类天堂| 欧美视频一二三区| 99久久国产综合色|国产精品| 久草中文综合在线| 免费av成人在线| 无码av中文一区二区三区桃花岛| 1区2区3区国产精品| 中文字幕av不卡| 国产肉丝袜一区二区| 久久综合色一综合色88| 欧美一区二区三区小说| 欧美日产国产精品| 欧美日韩一区三区| 欧美亚洲一区二区在线| 色综合久久久久久久| 97se亚洲国产综合自在线| 粉嫩av一区二区三区在线播放| 国产在线一区二区综合免费视频| 午夜精品久久久久久久久久| 亚洲精选视频在线| 亚洲最新在线观看| 亚洲福利视频一区二区| 日韩精品电影一区亚洲| 日韩高清欧美激情| 日本不卡高清视频| 蜜桃视频在线观看一区二区| 日韩制服丝袜av| 奇米在线7777在线精品| 久久国产生活片100| 久久国产麻豆精品| 狠狠网亚洲精品| 丁香婷婷综合网| 91亚洲国产成人精品一区二区三| 成人网男人的天堂| 一本久久综合亚洲鲁鲁五月天 | 精品一区二区三区日韩| 偷拍亚洲欧洲综合| 蜜桃久久av一区| 国产一区在线观看视频| 成人av片在线观看| 色欧美日韩亚洲| 欧美乱熟臀69xxxxxx| 精品三级av在线| 国产精品日日摸夜夜摸av| 亚洲视频 欧洲视频| 午夜精品福利视频网站| 久久精品国产亚洲高清剧情介绍| 国产综合成人久久大片91| 成人精品鲁一区一区二区| 一本到不卡精品视频在线观看| 欧美日韩在线播| 欧美国产精品v| 1区2区3区精品视频| 视频一区二区三区中文字幕| 国产一区二区三区电影在线观看| 亚洲欧美经典视频| 亚洲国产欧美日韩另类综合| 国产精品久久久久久久久久久免费看 | 在线精品国精品国产尤物884a| 日韩三级在线观看| 一区二区三区不卡在线观看 | 美脚の诱脚舐め脚责91| 欧美视频日韩视频在线观看| 国产精品女同一区二区三区| 国产一区二区三区不卡在线观看| 日韩你懂的在线播放| 日韩经典中文字幕一区| 欧美日产在线观看| 亚洲动漫第一页| 欧美系列一区二区| 五月婷婷欧美视频| 欧美精品在线视频| 日韩精品亚洲专区| 3751色影院一区二区三区| 亚洲成va人在线观看| 欧美精品99久久久**| 性做久久久久久免费观看| 欧美日韩一区二区三区视频 | 亚洲精品菠萝久久久久久久| 色综合一个色综合| 亚洲精品免费播放| 欧美亚洲国产一区在线观看网站| 一区二区视频在线看| 欧美亚洲综合色| 午夜精品久久久久久久99樱桃| 欧美日韩一本到| 美国十次了思思久久精品导航| 精品久久人人做人人爰| 国产精品一级在线| 国产精品污网站| 日本久久一区二区| 日日夜夜精品视频免费| 精品国产一区a| 国产精品99久久久久久似苏梦涵| 国产视频911| 91污在线观看| 午夜精品久久久久久不卡8050| 欧美一区二区高清| 国产福利一区在线观看| 亚洲日本护士毛茸茸| 91精品国产手机| 国产成人av电影在线|