棋盘上面两个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;
}