3 条题解
-
-3
#include<bits/stdc++.h> #define x first #define y second using namespace std; typedef pair<int,int> pii; bool vis[1 << 20][20]; int n, endp; map<pii,pii> mp; vector<pii> vec; map<pii,int> d;//这种状态下,部署的值,如果值相等,优先使用从 void dfs(pii s,int t){ if(!mp.count(s)) return;//当没有就返回 vec.push_back({s.x,2*n-s.second+1}); dfs(mp[s],t > 5 ? 2 : t + 1); } void print(){ for (int i = 0; i < vec.size(); i ++){ cout << vec[i].y; if((i+1) % 5 == 0){ cout << endl; } else{ cout << " "; } } } void bfs(pii begin){ queue<pii> q; q.push(begin);//将状态还有空格右边有多少个棋子位置放进去 vis[begin.x][begin.y] = true;//当前状态和2进制为空格位置设置已经遍历过 int res = 0; while(!q.empty()){ pii t = q.front(); int s = t.x, x = t.y; q.pop(); if(s == endp && x == n){ dfs(t, 1); reverse(vec.begin(),vec.end()); print(); return; } //空格左边棋子跨过移动到空格 if(x <= 2*n - 2 && x > 0){ if(s >> x + 1 & 1) {//如果左边0还尝试往右边走,那就不让他走 if((s >> x + 1 & 1) ^ (s >> x & 1)){//如果俩不相同 int ts = s ^ (3 << x); int tx = x + 2; if(!vis[ts][tx]){ q.push({ts,tx}); vis[ts][tx] = true; mp[{ts,tx}] = t; } } } } //空格左边棋子移动到空格上 if(x < 2*n){ int tx = x + 1; if(s >> x & 1){ //如果左边0还尝试往右边走,那就不让他走 if(!vis[s][tx]){ q.push({s,tx}); vis[s][tx] = true; mp[{s,tx}] = t;//当前状态是从t转移过来的 } } } //空格右边棋子移动到空格上 if(x > 0){ if((s >> x - 1 & 1) == 0) { int tx = x - 1; if(!vis[s][tx]){ q.push({s,tx}); vis[s][tx] = true; mp[{s,tx}] = t;//当前状态是从t转移过来的 } } } //空格右边棋子跨过移动到空格 if(x >= 2 && x <= 2*n){ if((s >> x - 2 & 1) == 0) { if((s & (1 << x - 1)) ^ (s & (1 << x - 2))){//如果俩不相同 int ts = s ^ (3 << x - 2); int tx = x - 2; if(!vis[ts][tx]){ q.push({ts,tx}); vis[ts][tx] = true; mp[{ts,tx}] = t; } } } } } } int main(){ freopen("chess.in","r",stdin); freopen("chess.out","w",stdout); cin >> n; int s = 0; for (int i = 1; i <= n; i ++){ endp <<= 1; s <<= 1; s += 1; endp += 1; } s <<= n; bfs({s,n}); return 0; } //空格左边棋子移动到空格上 //空格右边棋子移动到空格上 //空格左边棋子跨过移动到空格 //空格右边棋子跨过移动到空格 //111 000 //11 1000 //1101 00 //11010 0 //110 010 //1 01010 // 101010 //01 1010 //0101 10 //010101 //01010 1 //010 011 //0 01011 //00 1011 //0001 11 //000 111
信息
- ID
- 558
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 58
- 已通过
- 9
- 上传者