非常普通的一道bfs題,做的時候貪快,沒想好就寫了。。。唉。。
對於給的一盤棋,最多只有 2^16 種翻法,並且翻的先後順序不影響結果,所以只需要bfs列舉一下就好了
對於每出現過的一種狀態,用狀態壓縮的數值標記一下,不用再進入佇列(否則會超時或者死迴圈啦)
暴力 模擬一下 ,每次檢查是否 全黑65535 或者全白 0 就可以了
#include #include #include #include #include #include #includeusing namespace std;
int min(int a,int b)
return ret;
}bool vis[1<<16+5];
node flap(node tt,int xx,int yy)
tt.x=xx;
tt.y=yy;
return tt;
}int main()
getchar();
} int minstep=2147483647;
while(!qq.empty()) qq.pop();
qq.push(st);
while(!qq.empty())
for (i=1;i<=4;i++)
vis[res]=true;
ret.step=tt.step+1;
qq.push(ret);}}
}if (minstep==2147483647)
printf("impossible\n");
else
printf("%d\n",minstep);
return 0;
}
POJ1753 狀態壓縮( BFS) 棋盤問題
棋盤問題,改變乙個子的顏色,這個子以及這個子周圍的四個位置 左右上下 的子分別變色,求最少的改變次數。此類題大部分應該可以用狀態壓縮 暴力搜尋解決。純粹找規律不太合理。1 第一種方法,狀態壓縮後bfs暴力搜尋。因為棋盤很小,只有16個格仔,列舉所有的狀態共有2 16 65536種。所以有可以用int...
狀態壓縮BFS
魔板,狀態壓縮bfs include include include include include include using namespace std unordered mapint dist 記錄變換到當前狀態所需要的步驟數 unordered mapchar string pre s 記...
poj 1753 位壓縮 搜尋
題意 有乙個4 4的方格,每個方格中放一粒棋子,這個棋子一面是白色,一面是黑色。遊戲規則為每次任選16顆中的一顆,把選中的這顆以及它四周的棋子一併反過來,當所有的棋子都是同乙個顏色朝上時,遊戲就完成了。現在給定乙個初始狀態,要求輸出能夠完成遊戲所需翻轉的最小次數,如果初始狀態已經達到要求輸出0。如果...