这个题不是很难,就是暴力模拟一下,利用二进制表示状态,反正最后一共15种结果,暴力程序跑慢点也没事~,2个程序一个250行的暴力,一个150行的表,也是蛮拼的。。
14933000 | 1533 | Moving Pegs | Accepted | C++ | 0.009 | 2015-02-06 03:15:36 |
暴力程序:
#include<cstdio>
#include<queue>
#include<set>
#include<cstring>
#include<algorithm>
using namespace std;
typedef pair<int,int> pill;
const int maxd = 20;
int n;
int st;
vector<int>G[maxd][8];
vector<int>vis[1<<16];
struct Node{
int st;
vector<int>way;
Node(int st){
this -> st = st;
}
};
//4164;2>;?61::7;441
//4 1 6 4 11 2 15 6 1 10 10 7 14 11 11 4 4 1
//4164;2>;?61::7;441
//4 1 6 4 11 2 14 11 15 6 1 10 10 7 11 4 4 1
queue<Node>q;
bool judge(int v){
int cnt = 0;
for(int i = 0; i < 15; i++)
if(v & (1 << i))
cnt ++;
if(cnt == 14)
return true;
else
return false;
}
void debug(int n){
if(n == 0) return ;
debug(n / 2);
printf("%d",n % 2);
}
void init(){
//6个方向
// 1 2
// 3 4
// 5 6
//编号1
G[1][5].push_back(2);G[1][5].push_back(4);G[1][5].push_back(7);G[1][5].push_back(11);
G[1][6].push_back(3);G[1][6].push_back(6);G[1][6].push_back(10);G[1][6].push_back(15);
//编号2
G[2][2].push_back(1);
G[2][4].push_back(3);
G[2][5].push_back(4);G[2][5].push_back(7);G[2][5].push_back(11);
G[2][6].push_back(5);G[2][6].push_back(9);G[2][6].push_back(14);
//编号3
G[3][1].push_back(1);
G[3][3].push_back(2);
G[3][5].push_back(5);G[3][5].push_back(8);G[3][5].push_back(12);
G[3][6].push_back(6);G[3][6].push_back(10);G[3][6].push_back(15);
//编号4
G[4][2].push_back(2);G[4][2].push_back(1);
G[4][4].push_back(5);G[4][4].push_back(6);
G[4][5].push_back(7);G[4][5].push_back(11);
G[4][6].push_back(8);G[4][6].push_back(13);
//编号5
G[5][1].push_back(2);
G[5][2].push_back(3);
G[5][3].push_back(4);
G[5][4].push_back(6);
G[5][5].push_back(8);G[5][5].push_back(12);
G[5][6].push_back(9);G[5][6].push_back(14);
//编号6
G[6][1].push_back(3);G[6][1].push_back(1);
G[6][3].push_back(5);G[6][3].push_back(4);
G[6][5].push_back(9);G[6][5].push_back(13);
G[6][6].push_back(10);G[6][6].push_back(15);
//编号7
G[7][2].push_back(4);G[7][2].push_back(2);G[7][2].push_back(1);
G[7][4].push_back(8);G[7][4].push_back(9);G[7][4].push_back(10);
G[7][5].push_back(11);
G[7][6].push_back(12);
//编号8
G[8][1].push_back(4);
G[8][2].push_back(5);G[8][2].push_back(3);
G[8][3].push_back(7);
G[8][4].push_back(9);G[8][4].push_back(10);
G[8][5].push_back(12);
G[8][6].push_back(13);
//编号9
G[9][1].push_back(5);G[9][1].push_back(2);
G[9][2].push_back(6);
G[9][3].push_back(8);G[9][3].push_back(7);
G[9][4].push_back(10);
G[9][5].push_back(13);
G[9][6].push_back(14);
//编号10
G[10][1].push_back(6);G[10][1].push_back(3);G[10][1].push_back(1);
G[10][3].push_back(9);G[10][3].push_back(8);G[10][3].push_back(7);
G[10][5].push_back(14);
G[10][6].push_back(15);
//编号11
G[11][2].push_back(7);G[11][2].push_back(4);G[11][2].push_back(2);G[11][2].push_back(1);
G[11][4].push_back(12);G[11][4].push_back(13);G[11][4].push_back(14);G[11][4].push_back(15);
//编号12
G[12][1].push_back(7);
G[12][2].push_back(8);G[12][2].push_back(5);G[12][2].push_back(3);
G[12][3].push_back(11);
G[12][4].push_back(13);G[12][4].push_back(14);G[12][4].push_back(15);
//编号13
G[13][1].push_back(8);G[13][1].push_back(4);
G[13][2].push_back(9);G[13][2].push_back(6);
G[13][3].push_back(12);G[13][3].push_back(11);
G[13][4].push_back(14);G[13][4].push_back(15);
//编号14
G[14][1].push_back(9);G[14][1].push_back(5);G[14][1].push_back(2);
G[14][2].push_back(10);
G[14][3].push_back(13);G[14][3].push_back(12);G[14][3].push_back(11);
G[14][4].push_back(15);
//编号15
G[15][1].push_back(10);G[15][1].push_back(6);G[15][1].push_back(3);G[15][1].push_back(1);
G[15][3].push_back(14);G[15][3].push_back(13);G[15][3].push_back(12);G[15][3].push_back(11);
}
void BFS(){
while(!q.empty()) q.pop();
Node start(st);
q.push(start);
vector<int>ans;
int isok = 0;
while(!q.empty()){
Node state = q.front(); q.pop();
int now = state.st;
if(judge(now)){
int e = state.way.size();
if(state.way[e - 1] != n) continue;
// for(int i = 0; i < state.way.size(); i++)
// printf("%d ",state.way[i]);
// printf("\n");
isok = 1;
if(!ans.size()){
ans = state.way;
}
else{
int can_add = 0;
int L1 = state.way.size();
int L2 = ans.size();
if(L1 < L2){
ans = state.way;
}
else if(L1 == L2)
for(int x = 0; x < L1 && x < L2; x++){
if(state.way[x] > ans[x]){
can_add = -1;
break;
}
else if(state.way[x] < ans[x]){
can_add = 1;
break;
}
}
if(can_add == 1){
ans = state.way;
}
else if(can_add == 0 && L1 < L2){
ans = state.way;
}
}
}
for(int i = 1; i <= 15; i++){
if(now & (1 << (i - 1))){ //如果这一位为空,从6个方向找可以跳到这里的位置
for(int j = 1; j <= 6; j++){
int cnt = 0;
for(int k = 0; k < G[i][j].size(); k++){
int e = G[i][j][k];
if(now & (1 << (e - 1))) //如果是空白,跳出循环
break;
else{
cnt ++;
if(cnt == 1) //如果不是空白
continue;
int temp = now;
int l;
//-------------------------------------------------
for(l = 0;l <= k; l++){ //这一条线上的全部清空
//这条线上全部清
int c = G[i][j][l];
temp |= (1 << (c - 1));
}
temp = ~temp;
temp = temp | (1 << (i - 1));
temp = ~temp;
//-------------------------------------------------
Node tmp = state;
tmp.st = temp;
tmp.way.push_back(e);
tmp.way.push_back(i);
if(!vis[temp].size()){
vis[temp] = tmp.way;
q.push(tmp);
}
else{
int can_add = 0;
int L1 = tmp.way.size();
int L2 = vis[temp].size();
for(int x = 0; x < L1 && x < L2; x++){
if(tmp.way[x] > vis[temp][x]){
can_add = -1;
break;
}
else if(tmp.way[x] < vis[temp][x]){
can_add = 1;
break;
}
}
if(can_add == 1){
vis[temp] = tmp.way;
q.push(tmp);
}
else if(can_add == 0 && L1 < L2){
vis[temp] = tmp.way;
q.push(tmp);
}
}
}
}
}
}
}
}
if(!isok){
printf("IM");
}
else{
printf("%d\n",ans.size() / 2);
for(int i = 0; i < ans.size(); i++)
printf("%d ",ans[i]);
}
return;
}
int main(){
int T;
init();
scanf("%d",&T);
while(T--){
scanf("%d",&n);
st = 0;
st |= (1 << (n - 1));
BFS();
}
return 0;
}
打表:
#include<cstdio>
#include<vector>
using namespace std;
const int maxd = 16;
int size[] = {18,18,18,18,20,18,18,20,20,18,18,18,18,18,18};
int L1[] = {4,1,6,4,11,2,14,11,15,6,1,10,10,7,11,4,4,1}; //18
int L2[] = {7,2,1,4,10,1,14,2,1,7,11,14,15,13,13,4,7,2}; //18
int L3[] = {10,3,1,6,7,1,12,3,1,10,14,12,11,13,13,6,15,3}; //18
int L4[] = {1,4,6,1,13,6,10,3,11,13,3,12,15,11,11,2,1,4}; //18
int L5[] = {12,5,3,8,15,12,6,13,7,9,1,7,10,8,7,9,11,14,14,5};//20
int L6[] = {1,6,4,1,13,4,7,2,15,13,2,14,11,15,15,3,1,6}; //18
int L7[] = {1,7,6,1,11,4,9,7,14,11,11,2,15,6,6,4,1,7}; //18
int L8[] = {3,8,12,5,15,3,13,6,1,10,2,9,11,2,14,5,2,9,10,8}; //20
int L9[] = {2,9,11,2,12,5,3,8,13,4,1,7,14,5,15,3,3,8,7,9}; //20
int L10[]= {1,10,4,1,11,4,4,6,12,5,10,8,15,12,12,3,1,10}; //18
int L11[]= {4,11,1,4,10,1,14,2,1,7,11,14,15,13,13,4,4,11}; //18
int L12[]= {14,12,2,14,7,2,1,4,15,13,3,15,11,14,4,13,15,12}; //18
int L13[]= {4,13,1,4,11,2,13,11,15,13,2,14,3,15,15,12,11,13};//18
int L14[]= {11,14,2,11,3,12,10,3,1,6,11,13,15,12,6,13,12,14};//18
int L15[]= {6,15,1,6,7,1,12,3,1,10,15,12,11,13,13,6,6,15}; //18
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int sz = size[n - 1];
if(n == 1){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L1[i]);
}
}
else if(n == 2){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L2[i]);
}
}
else if(n == 3){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L3[i]);
}
}
else if(n == 4){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L4[i]);
}
}
else if(n == 5){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L5[i]);
}
}
else if(n == 6){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L6[i]);
}
}
else if(n == 7){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L7[i]);
}
}
else if(n == 8){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L8[i]);
}
}
else if(n == 9){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L9[i]);
}
}
else if(n == 10){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L10[i]);
}
}
else if(n == 11){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L11[i]);
}
}
else if(n == 12){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L12[i]);
}
}
else if(n == 13){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L13[i]);
}
}
else if(n == 14){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L14[i]);
}
}
else if(n == 15){
printf("%d\n",sz / 2);
for(int i = 0; i < sz; i++){
if(i) printf(" ");
printf("%d",L15[i]);
}
}
else
printf("IMPOSSIBLE");
printf("\n");
}
return 0;
}