跳棋参考代码
作者:互联网
#include<iostream> #include<algorithm> #include<string> #include<cstring> #include<queue> using namespace std; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; struct point{ int x,y; }; bool cmp(point a,point b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } struct node{ point s[5]; int dis; int dir; }; void copy(node a,node &b) { b.dir=a.dir; b.dis=a.dis; for(int i=1; i<5; i++) { b.s[i].x=a.s[i].x; b.s[i].y=a.s[i].y; } } queue<node>s; char vis[8][8][8][8][8][8][8][8]; bool check(node a,node b) { for(int i=1; i<5; i++) { if(a.s[i].x!=b.s[i].x) return false; if(a.s[i].y!=b.s[i].y) return false; } return true; } bool checkcf(int xx,int yy,node a) { for(int i=1; i<5; i++) if(a.s[i].x==xx&&a.s[i].y==yy) return false; return true; } int bj(node a) { if(vis[a.s[1].x][a.s[1].y][a.s[2].x][a.s[2].y][a.s[3].x][a.s[3].y][a.s[4].x][a.s[4].y]==0) { vis[a.s[1].x][a.s[1].y][a.s[2].x][a.s[2].y][a.s[3].x][a.s[3].y][a.s[4].x][a.s[4].y]=a.dir; return 0; } return vis[a.s[1].x][a.s[1].y][a.s[2].x][a.s[2].y][a.s[3].x][a.s[3].y][a.s[4].x][a.s[4].y]; } void bfs(node a,node b) { if(check(a,b)) { cout<<"YES"<<endl; return; } while(!s.empty()) { node cur=s.front(); s.pop(); if(cur.dis==4){ cout<<"NO"<<endl; return; } for(int i=1; i<5; i++) for(int j=0; j<4; j++) { int xx=cur.s[i].x+dx[j]; int yy=cur.s[i].y+dy[j]; if(!checkcf(xx,yy,cur))//不能走,就只能跳 xx+=dx[j],yy+=dy[j]; if(xx<0||xx>7||yy<0||yy>7) continue; if(checkcf(xx,yy,cur))//检测能否走或者跳 { node nw; copy(cur,nw); nw.s[i].x=xx; nw.s[i].y=yy; nw.dis=cur.dis+1; nw.dir=cur.dir; sort(nw.s+1,nw.s+5,cmp); if(bj(nw)==0) s.push(nw); else if(bj(nw)==cur.dir) continue; else{ cout<<"YES"<<endl; return; } } } } } void init() { while(!s.empty()) s.pop(); memset(vis,0,sizeof(vis)); } int main() { freopen("cheer.in","r",stdin); freopen("cheer.out","w",stdout); node a; while(scanf("%d%d",&a.s[1].x,&a.s[1].y)!=EOF) { init(); a.s[1].x--,a.s[1].y--; for(int i=2; i<5; i++) cin>>a.s[i].x>>a.s[i].y,a.s[i].x--,a.s[i].y--; a.dis=0; a.dir=1; sort(a.s+1,a.s+5,cmp); s.push(a);bj(a); node b; b.dis=0; b.dir=2; for(int i=1; i<5; i++) cin>>b.s[i].x>>b.s[i].y,b.s[i].x--,b.s[i].y--; sort(b.s+1,b.s+5,cmp); s.push(b);bj(b); bfs(a,b); } return 0; } Online Judge Footer
标签:node,cur,参考,int,代码,跳棋,include,dir,nw 来源: https://www.cnblogs.com/nhflsoiers/p/12591447.html