Game pku

棋盘上面两个pawn作为状态,最少步数暗示使用广度优先算法,每一步pawn的移动都会形成多个状态。类似树的层序遍历把状态装入队列。

#include<iostream>

#define MAXNODE 101

#define MAXQUEUE 15000

using namespace std;

typedef struct _circle{

int color;

int line[MAXNODE];

int cofl[MAXNODE];

int lnum;

}circle;

circle cs[MAXNODE];

typedef struct _state{

int x;

int y;

}state;

bool used[MAXNODE][MAXNODE];

state queue[MAXQUEUE];

int qh,qt;

int N,L,K,Q;

int main(){

int nl,i,j,k,c,times,level;

state tmp;

bool find;

memset(cs,0,MAXNODE*sizeof(circle));

memset(used,false,MAXNODE*MAXNODE);

cin >> N >> L >> K >> Q;

for(i=1;i<=N;i++){

cin >> cs[i].color;

}

cin >> nl;

for(i=0;i<nl;i++){

cin >> j >> k >> c;

cs[j].line[cs[j].lnum] = k;

cs[j].cofl[cs[j].lnum] = c;

cs[j].lnum ++;

}

qh = 0;qt = 1;

queue[0].x = L;

queue[0].y = K;

find = false;

times = 1;

level = 1;

while(qh !=  qt){

tmp = queue[qh];

for(i=0;i<cs[tmp.x].lnum;i++){

if(cs[tmp.y].color == cs[tmp.x].cofl[i] && cs[tmp.x].line[i] != tmp.y&&!used[tmp.x][cs[tmp.x].line[i]]){

used[tmp.x][cs[tmp.x].line[i]] = true;

queue[qt].x = cs[tmp.x].line[i];queue[qt].y = tmp.y;

if(queue[qt].x == Q || queue[qt].y == Q){

find = true; break;

}

qt++;

}

}

for(i=0;i<cs[tmp.y].lnum;i++){

if(cs[tmp.x].color == cs[tmp.y].cofl[i] && cs[tmp.y].line[i] != tmp.x&&!used[tmp.y][cs[tmp.y].line[i]]){

used[tmp.y][cs[tmp.y].line[i]] = true;

queue[qt].x = tmp.x; queue[qt].y = cs[tmp.y].line[i];

if(queue[qt].x == Q || queue[qt].y == Q){

find = true; break;

}

qt++;

}

}

if(find) break;

qh++;

if(qh == level){ 

level = qt;

times++;

}

}

if(find) cout<< "YES" << endl << times <<endl;

else cout << "NO" <<endl;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值