1. 甯哥敤镄勬暟鎹铡嬬缉绠楁硶链夊摢浜涳纻
鍦ㄦ暟瀛楀寲镞朵唬锛屾暟鎹镄勫瓨鍌ㄥ拰浼犺緭鏁堢巼鏄惧缑灏や负閲嶈併备负浜嗗噺灏忓瓨鍌ㄧ┖闂村拰甯﹀介渶姹傦纴钖勭嶆暟鎹铡嬬缉绠楁硶濡傞洦钖庢槬绗嬭埇娑岀幇銆傝繖浜涚畻娉曚緷鎹涓嶅悓镄勫师鐞嗗拰阃傜敤鍦烘櫙锛屽垎涓哄彲阃嗗拰闱炲彲阃嗕袱绉岖被鍨嬶纴镞ㄥ湪鍦ㄤ缭璇佹暟鎹瀹屾暣镐х殑鍓嶆彁涓嬶纴灏藉彲鑳藉湴铡嬬缉鏁版嵁浣撶Н銆傝╂垜浠娣卞叆鎺㈣ㄤ竴涓嬭繖浜涘父鐢ㄧ殑鏁版嵁铡嬬缉绠楁硶銆
棣栧厛锛屽彲阃嗗帇缂╃畻娉曪纴濡侣uffman缂栫爜锛屼互鍏舵棤鎹熺壒镐ц屽弹鍒伴潚镌愩傚畠阃氲繃瀵规暟鎹镄勯戠巼鍒嗘瀽锛屼负姣忎釜瀛楃﹀垎閰嶆渶鐭镄勭紪镰侊纴浠庤屽疄鐜伴珮鏁堢殑铡嬬缉銆傝繖绉岖紪镰佹柟寮忕‘淇濅简瑙e帇钖庣殑鏁版嵁涓庡师濮嬫暟鎹涓镊达纴阃傜敤浜庡规暟鎹鍑嗙‘镐ц佹眰鏋侀珮镄勫満鏅銆
鎺ョ潃锛岄潪鍙阃嗗帇缂╃畻娉曞侸PEG锛屼互鐗虹壊涓瀹氱殑鏁版嵁绮剧‘搴︽崲鍙栨洿楂樼殑铡嬬缉姣斻傝繖绫荤畻娉曞湪锲惧儚澶勭悊鍜岃嗛戝帇缂╀腑骞挎硾搴旂敤锛屽挨鍏舵槸鍦ㄥ硅呜夎川閲忚佹眰鐩稿硅缉浣庣殑𨱍呭喌涓嬶纴鑳芥樉镢楀噺灏忔暟鎹閲忋
鏁版嵁铡嬬缉镄勭瓥鐣ュ氱嶅氭牱锛屽寘𨰾锘轰簬鍐呭圭殑缂栫爜锛埚傚瓧绗︿覆涓棰戠箒瀛楃︾殑棰戠巼缂栫爜锛夈佽〃绀烘柟娉曪纸濡傞湇澶镟肩紪镰佸规椂搴忔暟鎹镄勯珮鏁埚勭悊锛変互鍙婂规暟鎹娴佽勫緥镐х殑鍒╃敤锛埚傛父绋嬬紪镰佸拰RLE锛岀敤浜庤繛缁閲嶅嶆暟鎹镄勫帇缂╋级銆备緥濡傦纴"this is a example"阃氲繃棰戠巼缂栫爜鑳藉噺灏忓埌54姣旂壒锛屾瘆铡熷136姣旂壒鑺傜渷绾2.5鍊岖殑瀛桦偍绌洪棿銆
Delta鍜娈elta-of-Delta缂栫爜鍒椤湪澶勭悊鏂囦欢铡嗗彶璁板綍鍜屽崟璋冨簭鍒楁椂琛ㄧ幇鍑鸿壊锛岄厤钖圧LE绛夋妧链锛岃兘鏄捐宪闄崭绠鏁版嵁澶у皬銆侱elta阃氲繃阃愪釜鍏幂礌镄勫樊寮傛潵铡嬬缉鏁版嵁锛岃屼簩阒跺樊鍒嗙紪镰佸垯杩涗竴姝ュ垎鏋愬墠钖庝袱涓鍏幂礌镄勫樊寮傦纴涓よ呭湪鐗瑰畾鍦烘櫙涓嬮兘鑳芥彁渚涢珮鏁埚帇缂┿
Zig-zag缂栫爜鐗瑰埆阍埚硅礋鏁帮纴涓嶥elta缁揿悎鑳芥湁鏁埚勭悊灏忔暟锛屽疄鐜伴珮鏁埚瓨鍌ㄣ侴oogle寮婧愮殑Snappy浠ュ叾蹇阃熺殑铡嬬缉阃熷害鍜屽悎鐞嗙殑铡嬬缉鏁堟灉锛屽箍娉涘簲鐢ㄤ簬寮婧愰”鐩锛岃孡Z4鍒欎互鍏跺瓧鑺傜骇镄勫揩阃熻В铡嬫ц兘锛岀壒鍒阃傚悎瀹炴椂鏁版嵁浼犺緭銆
Simple8b绠楁硶绠鍗曢珮鏁堬纴涓扑负灏忔暣鏁拌捐★纴浣嗗帇缂╃巼鍙鑳借缉浣庛侺ZO鍒欎互蹇阃熷帇缂╄侀暱锛屼絾瑙e帇阃熷害鐣ラ娄簬LZ4锛屾洿阃傚悎澶勭悊澶у潡鏁版嵁銆侱EFLATE绠楁硶鏄疴ip鏂囦欢镄勯粯璁ゅ帇缂╂柟寮忥纴瀹幂粨钖堜简LZ77鍜孒uffman缂栫爜锛屾彁渚涗简涓绉嶅钩琛$殑铡嬬缉绛栫暐銆
杩戝勾𨱒ワ纴Zstandard浠ュ叾楂樻晥镄勫帇缂╁拰蹇阃熺殑瑙e帇鑳藉姏宕闇插ご瑙掞纴涓烘湭𨱒ユ暟鎹铡嬬缉鎶链镄勫彂灞曟弿缁树简骞块様鍓嶆櫙銆傝孊it-packing鍒欓氲繃铡婚櫎涓嶅繀瑕佺殑浣嶏纴杩涗竴姝ヨ妭鐪佸瓨鍌ㄧ┖闂达纴浣嗗彲鑳藉奖鍝嶆暟鎹镄勮诲彇阃熷害銆
TDengine鏁版嵁搴挞噰鐢ㄤ简涓阒舵靛帇缂╋纸鍖呮嫭Delta銆丼imple8b銆亃ig-zag鍜孡Z4锛夊拰浜岄桩娈甸氱敤铡嬬缉绛栫暐锛屼互阃傚簲涓嶅悓鍦烘櫙镄勯渶姹伞傞夋嫨铡嬬缉绠楁硶镞讹纴闇瑕佺患钖堣冭槛铡嬬缉鏁堢巼銆佽В铡嬮熷害浠ュ强鏁版嵁镄勫师濮嬬簿搴︼纴浠ユ垒鍒版渶阃傚悎镄勮В鍐虫柟妗堛
鍦ㄦ暟瀛楀寲涓栫晫涓锛屾暟鎹铡嬬缉绠楁硶鏄鎻愬崌瀛桦偍鍜屼紶杈撴晥鐜囩殑鍏抽敭宸ュ叿銆傛疮涓绉岖畻娉曢兘链夊叾镫鐗圭殑浼桦娍鍜岄傜敤锣冨洿锛屼简瑙e苟𨱔垫椿杩愮敤杩欎簺宸ュ叿锛岃兘甯锷╂垜浠镟村ソ鍦扮$悊鏁版嵁锛岄檷浣庡瓨鍌ㄦ垚链锛屾彁楂樻暟鎹澶勭悊阃熷害銆
2. c++编程设计两道题。 求在n×m的棋盘上放k颗皇后的放法(1≤k≤n,m)(皇后可以斜着吃棋)(
采用状态压缩的办法,因为用搜索的办法,直接用32位的整数int进行压缩。
如果这个int的二进制位是1,就表示该位是在某个皇后的攻击范围,不能放只皇后,0表示可以放置。
因为一行最多摆放1个皇后,所以从行开始搜索。
以下是第一题的代码:
#include<iostream>
#include<cstring>
#defineULLunsignedlonglong
#defineUINTunsignedint
usingnamespacestd;
intN,M,K,ans;
voiddfs(introw,intdeep,UINTcol,UINTdig,UINTadg){//所在行,已放皇后数量,(列、左对角线、右对角线)的状态
if(deep==K){
ans++;
return;
}
if(row==N)return;
UINTt=1;
for(inti=0;i<M;i++){
if((t&col)||(t&dig)||(t&adg)){
t<<=1;
continue;
}
dfs(row+1,deep+1,(t|col),(t|dig)>>1,(t|adg)<<1);
t<<=1;
}
if((N-row-1)+deep>=K)//这行不摆放。优化:如果剩下行数都摆放了还不能满足条件,就不用搜下去了
dfs(row+1,deep,col,dig>>1,adg<<1);
}
intmain(){
while(cin>>N>>M>>K){
if(N<M)swap(N,M);//保证列数少,方便状态压缩
ans=0;
dfs(0,0,0,0,0);
cout<<ans<<endl;
}
return0;
}
第二问其实就是第一问k=n的情况
#include<iostream>
#include<cstring>
#defineULLunsignedlonglong
#defineUINTunsignedint
usingnamespacestd;
intN,M,K,ans;
voiddfs(introw,intdeep,UINTcol,UINTdig,UINTadg){//所在行,已放皇后数量,(列、左对角线、右对角线)的状态
if(deep==K){
ans++;
return;
}
if(row==N)return;
UINTt=1;
for(inti=0;i<M;i++){
if((t&col)||(t&dig)||(t&adg)){
t<<=1;
continue;
}
dfs(row+1,deep+1,(t|col),(t|dig)>>1,(t|adg)<<1);
t<<=1;
}
if((N-row-1)+deep>=K)
dfs(row+1,deep,col,dig>>1,adg<<1);
}
intmain(){
while(cin>>N>>M){
K=N;
if(N<M)swap(N,M);//保证列数少,方便状态压缩
ans=0;
dfs(0,0,0,0,0);
cout<<ans<<endl;
}
return0;
}