1699: 跳跳棋

#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<ctime>
#include<algorithm>
#define int long long
#define st pair<node,int>
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
struct node{
    int x,y,z;
}s,t;
int ch[4];
void init(){
    for(int i=1;i<=3;i++) ch[i]=read();
    sort(ch+1,ch+4);
    s.x=ch[1],s.y=ch[2],s.z=ch[3];
    for(int i=1;i<=3;i++) ch[i]=read();
    sort(ch+1,ch+4);
    t.x=ch[1],t.y=ch[2],t.z=ch[3];
}
st find(int x,int y,int z){
    int deep=0,d1=y-x,d2=z-y;
    while(d1!=d2){
        d1=y-x,d2=z-y;
        if(d1<d2){
            int step=d2/d1;
            if(d2%d1==0){
                x+=(step-1)*d1,y+=(step-1)*d1;
                deep+=(step-1);
            }else{
                x+=step*d1;y+=step*d1;
                deep+=step;
            }
        }else{
            int step=d1/d2;
            if(d1%d2==0){
                y-=(step-1)*d2;z-=(step-1)*d2;
                deep+=(step-1);
            }else{
                y-=step*d2;z-=step*d2;
                deep+=step;
            }
        }
    }
    node k;k.x=x,k.y=y,k.z=z;
    return make_pair(k,deep);
}
node get(int x,int y,int z,int deep){
    int d1=y-x,d2=z-y;
    while(d1!=d2&&deep!=0){
        d1=y-x,d2=z-y;
        if(d1<d2){
            int step=d2/d1;
            if(d2%d1==0){
                if(step-1<=deep){
                    deep-=(step-1);
                    x+=(step-1)*d1,y+=(step-1)*d1; 
                }else{
                    x+=deep*d1;y+=(deep*d1);deep=0;break;
                }
            }else{
                if(step<=deep){
                    deep-=step;
                    x+=step*d1,y+=step*d1;
                }else{
                    x+=deep*d1,y+=deep*d1;deep=0;break;
                }
            }
        }else{
            int step=d1/d2;
            if(d1%d2==0){
                if(step-1<=deep){
                    deep-=(step-1);
                    y-=(step-1)*d2,z-=(step-1)*d2;
                }else{
                    y-=deep*d2,z-=deep*d2;deep=0;break;
                }
            }else{
                if(step<=deep){
                    deep-=step;
                    y-=step*d2,z-=step*d2;
                }else{
                    y-=deep*d2,z-=deep*d2;deep=0;
                    break;
                }
            }
        }
    }
    node k;k.x=x,k.y=y,k.z=z;
    return k;
}
int ans=0;
bool same(node x1,node x2){return x1.x==x2.x&&x1.y==x2.y&&x1.z==x2.z;}
int l,r,minn=INT_MAX;
void check(){
    int tot=0;
    while(1){
        ch[1]=rand(),ch[2]=rand(),ch[3]=rand();
        if(ch[1]==ch[2]||ch[1]==ch[3]||ch[2]==ch[3]){continue;}
        sort(ch+1,ch+4);int x=ch[1],y=ch[2],z=ch[3];
        st p1=find(x,y,z);
        node k=p1.first;
        if(same(k,get(x,y,z,p1.second))){printf("AC %d\n",++tot);}
        else{
            printf("WA");exit(0);
        }
    }
}
signed main(){
    init();
    st p1=find(s.x,s.y,s.z);node k1=p1.first;int deep1=p1.second;
    st p2=find(t.x,t.y,t.z);node k2=p2.first;int deep2=p2.second;
    if(!same(k1,k2)){printf("NO\n");return 0;}
    printf("YES\n");
    if(deep1<deep2){ans+=deep2-deep1;node k=get(t.x,t.y,t.z,deep2-deep1);t.x=k.x,t.y=k.y,t.z=k.z;}
    else if(deep1>deep2){ans+=deep1-deep2;node k=get(s.x,s.y,s.z,deep1-deep2);s.x=k.x,s.y=k.y,s.z=k.z;}
    l=0,r=(deep1+deep2)<<1;
    while(l<=r){
        int mid=l+r>>1;
        if(same(get(s.x,s.y,s.z,mid),get(t.x,t.y,t.z,mid))){r=mid-1;minn=min(minn,mid);}
        else l=mid+1;
    }printf("%d\n",2*minn+ans);
}

好的,以下是一个简单的HTML跳棋代码,你可以参考一下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>跳棋</title> <style type="text/css"> td { width: 50px; height: 50px; border: 1px solid black; text-align: center; vertical-align: middle; font-size: 24px; } .red { background-color: red; color: white; } .black { background-color: black; color: white; } </style> <script type="text/javascript"> var board = []; var selected = null; var redTurn = true; var offset = [[-2, -2], [-2, 2], [2, -2], [2, 2], [-1, -1], [-1, 1], [1, -1], [1, 1]]; function initBoard() { for (var i = 0; i < 10; i++) { board[i] = []; for (var j = 0; j < 9; j++) { if (i < 5) { if ((i + j) % 2 === 0) { board[i][j] = {color: 'black', type: 'pawn'}; } else { board[i][j] = null; } } else if (i === 5) { if (j === 0 || j === 8) { board[i][j] = {color: 'black', type: 'rook'}; } else if (j === 1 || j === 7) { board[i][j] = {color: 'black', type: 'knight'}; } else if (j === 2 || j === 6) { board[i][j] = {color: 'black', type: 'bishop'}; } else if (j === 3) { board[i][j] = {color: 'black', type: 'guard'}; } else if (j === 4) { board[i][j] = {color: 'black', type: 'king'}; } else if (j === 5) { board[i][j] = {color: 'black', type: 'guard'}; } } else if (i > 5) { if ((i + j) % 2 === 0) { board[i][j] = {color: 'red', type: 'pawn'}; } else { board[i][j] = null; } } } } } function drawBoard() { var table = document.createElement('table'); for (var i = 0; i < 10; i++) { var tr = document.createElement('tr'); for (var j = 0; j < 9; j++) { var td = document.createElement('td'); if (board[i][j]) { td.className = board[i][j].color; td.innerHTML = board[i][j].type; } td.addEventListener('click', function() { var row = this.parentNode.rowIndex; var col = this.cellIndex; if (board[row][col] && board[row][col].color === (redTurn ? 'red' : 'black')) { selected = {row: row, col: col}; this.style.backgroundColor = 'yellow'; } else if (selected && canMove(selected.row, selected.col, row, col)) { move(selected.row, selected.col, row, col); selected = null; redTurn = !redTurn; drawBoard(); } }); tr.appendChild(td); } table.appendChild(tr); } document.body.appendChild(table); } function canMove(fromRow, fromCol, toRow, toCol) { var dx = toCol - fromCol; var dy = toRow - fromRow; var piece = board[fromRow][fromCol]; if (toRow < 0 || toRow > 9 || toCol < 0 || toCol > 8) { return false; } if (dx === 0 && dy === 0) { return false; } if (piece.type === 'pawn') { if (piece.color === 'red' && dy < 0) { return false; } else if (piece.color === 'black' && dy > 0) { return false; } if (Math.abs(dx) + Math.abs(dy) !== 1) { return false; } } else if (piece.type === 'rook') { if (dx !== 0 && dy !== 0) { return false; } if (dx === 0) { var step = dy > 0 ? 1 : -1; for (var i = fromRow + step; i !== toRow; i += step) { if (board[i][fromCol]) { return false; } } } else if (dy === 0) { var step = dx > 0 ? 1 : -1; for (var j = fromCol + step; j !== toCol; j += step) { if (board[fromRow][j]) { return false; } } } } else if (piece.type === 'knight') { if (Math.abs(dx) + Math.abs(dy) !== 3 || Math.abs(dx) === 0 || Math.abs(dy) === 0) { return false; } var x = fromCol + dx / 3; var y = fromRow + dy / 3; if (board[y][x]) { return false; } } else if (piece.type === 'bishop') { if (Math.abs(dx) !== Math.abs(dy)) { return false; } var stepX = dx > 0 ? 1 : -1; var stepY = dy > 0 ? 1 : -1; for (var i = fromRow + stepY, j = fromCol + stepX; i !== toRow; i += stepY, j += stepX) { if (board[i][j]) { return false; } } } else if (piece.type === 'guard') { if (piece.color === 'red' && (toRow < 7 || toCol < 3 || toCol > 5)) { return false; } else if (piece.color === 'black' && (toRow > 2 || toCol < 3 || toCol > 5)) { return false; } if (Math.abs(dx) !== 1 || Math.abs(dy) !== 1) { return false; } } else if (piece.type === 'king') { if (piece.color === 'red' && (toRow < 7 || toCol < 3 || toCol > 5)) { return false; } else if (piece.color === 'black' && (toRow > 2 || toCol < 3 || toCol > 5)) { return false; } if (Math.abs(dx) + Math.abs(dy) !== 1) { return false; } } return true; } function move(fromRow, fromCol, toRow, toCol) { board[toRow][toCol] = board[fromRow][fromCol]; board[fromRow][fromCol] = null; } window.onload = function() { initBoard(); drawBoard(); }; </script> </head> <body> </body> </html> ``` 这个代码实现了一个简单的跳棋游戏,包括棋盘的绘制、棋子的移动和规则的判断等功能。你可以将它保存为一个HTML文件,用浏览器打开后即可开始游戏。注意,这只是一个很基础的实现,如果你想要实现更多功能,比如多人对战、人机对战等,还需要进一步完善代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值