#include
#include
#include
#include
#include
#include
#include
#include
#include "jsoncpp/json.h"
using
namespace
std;
const
double epsilon = 0.0000001;
int currbotcolor; // 電腦執子顏色(1為黑,-1為白,棋盤狀態亦同)
int gridinfo[8][8] = ; // 先x後y,記錄棋盤狀態
int blackpiececount = 2, whitepiececount = 2;
const
int value[8][8] = ;
// 向direction方向改動座標,並返回是否越界 這個是八個方向上的
inline
bool movestep(int &x, int &y, int direction)
void draw(int b[8][8])
}cout
if (gridinfo[x][y] == -color) //移動一下還是對方棋子那就對方棋子個數加1,把對方的個數和位置記下來儲存到effectivepoints陣列上
else
if (gridinfo[x][y] == 0) //沒有棋子
else
//這種情況指的是這個棋子是我方,那麼計數器就不置0了,直接跳出,這時已經是我方棋子夾住了currcount多的敵方棋子
}if (currcount != 0)
else
//白棋
while (currcount > 0) //這裡把加在中間的對方棋子翻轉過去}}
if (isvalidmove) //如果這個地方是合法的座標,那麼下面就對這盤棋的黑白進行改變+1
else
return
false;
}class uctreenode
} // default constructor
void init()
blacknum=blackpiececount;
whitenum=whitepiececount;
colortoplay=-currbotcolor; //把玩家下完的棋局狀態記錄下來
}void inherit(uctreenode prenode)
blacknum=prenode.blacknum;
whitenum=prenode.whitenum;
}void copy(uctreenode &temp)
temp.blacknum=blacknum;
temp.whitenum=whitenum;
temp.colortoplay=colortoplay;
temp.xpos=xpos;
temp.ypos=ypos;
}bool isleaf() const
bool procstep(int xp, int yp,int color, bool checkonly = false)
if (board[x][y] == -color) //注意這裡在兩個函式中執行顏色有區別
//移動一下還是對方棋子那就對方棋子個數加1,把對方的個數和位置記下來儲存到effectivepoints陣列上
else
if (board[x][y] == 0) //沒有棋子
else
//這種情況指的是這個棋子是我方,那麼計數器就不置0了,直接跳出,這時已經是我方棋子夾住了currcount多的敵方棋子
}if (currcount != 0)
else
//白棋
while (currcount > 0) //這裡把加在中間的對方棋子翻轉過去}}
if (isvalidmove) //如果這個地方是合法的座標,那麼下面就對這盤棋的黑白進行改變+1
else
return
false;
}int possiblepos()
childnum=poscount;
return poscount;
}int selectaction()
} // for loop
//cout<<"孩子有:"value();
//cout<<"選擇的點是:"inherit(*this);//把父節點的局面給這個子節點
//這裡是變動後的下一步棋局面
vpchildren_i[selected]->procstep(position[selected][0],position[selected][1],vpchildren_i[selected]->colortoplay);
return selected; //找出uct最大的結點返回
} // selectaction
void expand()
if(childnum!=0)
isleaf_i=false;
}int simulation()
}int x = temp->position[tempi][0];
int y = temp->position[tempi][1];
temp->procstep(x, y, -temp->colortoplay); //原來是-的,搞了好久==
//draw(temp->board);
} else
zonenum++;
if(zonenum>1) break; //避免兩邊都沒子可下,一直迴圈的情況
temp->colortoplay=-temp->colortoplay;
}//cout<<"模擬落子:黑子"whitenum > temp->blacknum) || (currbotcolor==1 && temp->whitenum < temp->blacknum) )
return
1; //電腦是什麼顏色,最後這個顏色多就是勝利。
else
return
0; //好吧,輸和平局都返回0;
}void updatestats(double value)
void iterate()
//cout<<"以上從跟往下走到葉子結點"if(pcur->nvisits_i>75)
double value = pcur->simulation();
//pcur->value();
//cout<<"模擬下棋得到的值是:"}
int bestaction()
} // for loop
return selected;
} // bestaction
void value() const
};int main()
// 看看玩家本回合輸入
x = input["requests"][turnid]["x"].asint();
y = input["requests"][turnid]["y"].asint();
//cout= 0)
procstep(x, y, -currbotcolor); // 模擬對方落子
// 做出決策(你只需修改以下部分)
int resultx=-1, resulty=-1;
uctreenode tree;
tree.init(); //當前棋局當下來
//draw(tree.board);
tree.expand();
if(tree.childnum!=0)
//coutresultx=tree.vpchildren_i[bestaction]->xpos;
resulty=tree.vpchildren_i[bestaction]->ypos;
}// 決策結束,輸出結果(你只需修改以上部分)
json::value ret;
ret["response"]["x"] = resultx;
ret["response"]["y"] = resulty;
json::fastwriter writer;
cout
<< writer.write(ret) << endl; //這是電腦上的決定
return
0;}
如何計算加權和及矩陣乘法運算回顧
x和矩陣,每一行代表乙個詞,用xi x i xi 表示,y為一向量,表示每個詞的權重,shape為 n,通過轉化將y變為矩陣y,shape為 n,1 如何求x中每個詞的加權和,如下 x ty x ty xty其實上述不用將y轉化成y,因為矩陣可以直接與向量相乘,以上操作只是應用於attention機...
Neo4j 做推薦 (6) 加權內容演算法
除了考慮計算相似性的型別之外,還有更多的特徵,如演員和導演。讓我們使用加權總和根據他們共同的演員 流派和導演的數量對建議進行評分,以提高分數。根據重疊特徵的數量和型別計算加權和 find similar movies by common genres match m movie where m.ti...
洛谷 最大加權矩形 字首和,dp,矩陣壓縮
題目鏈結 題目 思路 這個就類似最大子串行,有人會問,這和最大子串行有關係?其實在我們進行矩陣壓縮後,這個問題其實就變成了最大子串行 矩陣壓縮 我的理解就是把矩陣分成小的矩陣 把每種情況都分出來 例我們有矩陣 1 2 3 4 5 6 7 8 9 我們先列舉第一行 1 2 3.再加上的第二行 1 2 ...