蓝桥杯 九宫重排 java_【蓝桥杯】历届试题 九宫重排

#include#include#include#include

using namespacestd;int dir[4] = {-3, 3, -1, 1}; //x, y 上 -3 下 +3 左 -1 右 +1

int fa[10] = { 1, 1, 2, 6, 24};int status[400000]; //记录每种状态//test

int testid = -1;char test[400000][12];structNode{char s[12];intstatus;intpos;intstep;

vectorids;

};voidgetfa(){for(int i = 5; i<=9; ++i){

fa[i]= fa[i-1] *i;

}

}int cantor(char *s){int ans = 0;for(int i=0;i<9;++i){int num = 0;for(int j=i+1;j<9;++j){if(s[j]

}//cout << " num " << num << endl;

ans = ans + num*fa[8-i];

}returnans;

}voidbfs(){

Node beginnode;char end[12], temps[12]; //初始位置

scanf("%s%s", beginnode.s, end);

beginnode.status=cantor(beginnode.s);for(int i=0;i<9;++i){if(beginnode.s[i]=='.'){

beginnode.pos=i;break;

}

}

beginnode.step= 0;int endc =cantor(end);

queueq; beginnode.ids.push_back(++testid);for(int k=0;k<9;++k){

test[testid][k]=beginnode.s[k];

}

q.push(beginnode);

status[beginnode.status]= 1;while(!q.empty()){

Node cur=q.front();//for(int i=0;i<9;++i) cout << cur.s[i];//cout << " " << cur.status << endl;//for(int i=0;i<9;++i){//if(i%3==0){//cout << endl;//}//cout << cur.s[i];//}//cout << endl;//getchar();

q.pop();if(endc ==cur.status){for(int kk=0;kk

cout<

}

cout<

}

cout<

}return;

}

Node addnode;for(int i=0;i<4;++i){int np = cur.pos +dir[i];if(np>=0 && np<=8){for(int j=0;j<9;++j){

addnode.s[j]=cur.s[j];

}

addnode.s[cur.pos]=cur.s[np];

addnode.s[np]=cur.s[cur.pos];

addnode.status=cantor(addnode.s);if(status[addnode.status] == 0){

addnode.pos=np;

addnode.step= cur.step+1;

status[addnode.status]= 1;/

addnode.ids.assign(cur.ids.begin(), cur.ids.end());

addnode.ids.push_back(++testid);for(int k=0;k<9;++k){

test[testid][k]=addnode.s[k];

}

q.push(addnode);

}

}

}

}

printf("-1");

}intmain(){

memset(status,0, sizeof(status));

getfa();

bfs();return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值