藍橋杯 由卡片換位引發的優化問題

2021-07-16 09:26:36 字數 1405 閱讀 8472

卡片問題,之前的我的**使用的是map,搜尋效率不高。

現由群裡的一位大牛給出的乙個由(康拓展開的狀態編碼優化演算法)

感謝這位「追夢」大牛

#include

#include

#include

#include

using namespace std;

//狀態結構體

struct state ;

int be,en;  //be表示a所在位置,en代表b所在位置

int fact[6];  //用於初始化階乘的值

//階乘值的初始化

void init()

int dp[6][6];  //動態規劃,用於記錄小於的個數(這裡可以進一步優化,因為多餘1個的數只有0),不失一般性,這裡用dp[i][j]記錄下標i的數後面數字j的個數

//dp陣列的初始化

void getlessnum(int s)

}//這是將狀態編碼的方法,返回編碼值,利用康托展開

int getmass(int s)

ret+=less*fact[5-i]/div; }

return ret; }

//這裡是將對應編碼轉化為對應的狀態,即逆康托

state masstostate(int mass) ;

while(i<6)

else

} }

return ret; }

bool vis[120];  //這是判重陣列,因為總狀態數即a(6,6)/a(3,3)=120種

//這裡是bfs的方向偏移陣列

int dx[4]=; 

int dy[4]=;

//這裡判斷(x,y)是否是合法的點

bool i***ceed(int x,int y)

queueq;  //bfs所用佇列,這裡用stl的queue實現

//bfs廣度優先搜尋,如果不能達到則返回-1

int bfs(int s_b,int bemass)

} }

return -1; }

int main()

else if(str[j]=='b')

else if(str[j]==' ') state_begin[3*i+j]=3;

else state_begin[3*i+j]=0; }

}init();

getlessnum(state_begin);

int mass=getmass(state_begin);

int ans=bfs(state_begin,mass);

if(ans!=-1) printf("%d\n",ans);

else printf("impossible\n");

return 0; }

藍橋杯2016初賽 卡片換位

你玩過華容道的遊戲嗎?這是個類似的,但更簡單的遊戲。看下面 3 x 2 的格仔 a b 在其中放5張牌,其中a代表關羽,b代表張飛,代表士兵。還有乙個格仔是空著的。你可以把一張牌移動到相鄰的空格中去 對角不算相鄰 遊戲的目標是 關羽和張飛交換位置,其它的牌隨便在 都可以。輸入輸入存在多組測試資料,對...

藍橋杯2016初賽 卡片換位 BFS

題目描述 你玩過華容道的遊戲嗎?這是個類似的,但更簡單的遊戲。看下面 3 x 2 的格仔 a b 在其中放5張牌,其中a代表關羽,b代表張飛,代表士兵。還有乙個格仔是空著的。你可以把一張牌移動到相鄰的空格中去 對角不算相鄰 遊戲的目標是 關羽和張飛交換位置,其它的牌隨便在 都可以。輸入 輸入存在多組...

藍橋杯 2016CC 卡片換位

卡片換位 你玩過華容道的遊戲嗎?這是個類似的,但更簡單的遊戲。看下面 3 x 2 的格仔 在其中放5張牌,其中a代表關羽,b代表張飛,代表士兵。還有乙個格仔是空著的。你可以把一張牌移動到相鄰的空格中去 對角不算相鄰 遊戲的目標是 關羽和張飛交換位置,其它的牌隨便在 都可以。輸入格式 輸入兩行6個字元...