CSU 1224 ACM小组的古怪象棋
生活随笔
收集整理的這篇文章主要介紹了
CSU 1224 ACM小组的古怪象棋
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
E - ACM小組的古怪象棋 Time Limit:1000MS????Memory Limit:131072KB????64bit IO Format:%lld & %llu SubmitStatusPracticeCSU 1224
Description
ACM小組的Samsara和Staginner對中國象棋特別感興趣,尤其對馬(可能是因為這個棋子的走法比較多吧)的使用進行深入研究。今天他們又在 構思一個古怪的棋局:假如Samsara只有一個馬了,而Staginner又只剩下一個將,兩個棋子都在棋盤的一邊,馬不能出這一半棋盤的范圍,另外這 一半棋盤的大小很奇特(n行m列)。Samsara想知道他的馬最少需要跳幾次才能吃掉Staginner的將(我們假定其不會移動)。當然這個光榮的任 務就落在了會編程的你的身上了。
Input
每組數據一行,分別為六個用空格分隔開的正整數n,m,x1,y1,x2,y2分別代表棋盤的大小n,m,以及將的坐標和馬的坐標。(1<=x1,x2<=n<=20,1<=y1,y2<=m<=20,將和馬的坐標不相同)
Output
輸出對應也有若干行,請輸出最少的移動步數,如果不能吃掉將則輸出“-1”(不包括引號)。
Sample Input
8 8 5 1 4 5Sample Output
3Hint
BFS.
多了一步判斷馬是否“蹩腿”。
#include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #define N 25 using namespace std; typedef struct {int x,y, step; }node; int dx[8]={1,-1,-2,-2,-1,1,2,2}; int dy[8]={2,2,1,-1,-2,-2,-1,1}; int vis[N][N]; int n,m,kstartx,kstarty,kendx,kendy; queue <node> q; int bfs(int x,int y) {int i,j,xx,yy;while(!q.empty())q.pop();node fir;fir.step=0;fir.x=x;fir.y=y;memset(vis,0,sizeof(vis));vis[x][y]=1;q.push(fir);while(!q.empty()){node fro=q.front();q.pop();i=fro.x;j=fro.y;if(i==kendx&&j==kendy){return fro.step;}node nxt;for(int k=0;k<8;k++){xx=i+dx[k],yy=j+dy[k];if(xx<0 || yy<0 || xx>=n || yy>=m || vis[xx][yy]) continue;if(dx[k]==2&&kendy==j&&kendx==(i+1)) continue;if(dx[k]==-2&&kendy==j&&kendx==(i-1)) continue;if(dy[k]==2&&kendx==i&&kendy==(j+1)) continue;if(dy[k]==-2&&kendx==i&&kendy==(j-1)) continue;if(xx==kendx&&yy==kendy) return fro.step+1;vis[xx][yy]=1;nxt.step=fro.step+1;nxt.x=xx;nxt.y=yy;q.push(nxt);}}return -1; } int main() {while(scanf("%d%d%d%d%d%d",&n,&m,&kendx,&kendy,&kstartx,&kstarty)>0){kstartx--,kstarty--,kendx--,kendy--;printf("%d\n",bfs(kstartx,kstarty));}return 0; }總結
以上是生活随笔為你收集整理的CSU 1224 ACM小组的古怪象棋的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当对手有 45 亿资金、1 亿用户,你怎
- 下一篇: 红宝书读书笔记 第八章