卡片問題,之前的我的**使用的是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個字元...