其他分享
首页 > 其他分享> > 跳棋参考代码

跳棋参考代码

作者:互联网

#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