CSU 1224 ACM小组的古怪象棋
Description
ACM小組的Samsara和Staginner對(duì)中國象棋特別感興趣,尤其對(duì)馬(可能是因?yàn)檫@個(gè)棋子的走法比較多吧)的使用進(jìn)行深入研究。今天他們又在 構(gòu)思一個(gè)古怪的棋局:假如Samsara只有一個(gè)馬了,而Staginner又只剩下一個(gè)將,兩個(gè)棋子都在棋盤的一邊,馬不能出這一半棋盤的范圍,另外這 一半棋盤的大小很奇特(n行m列)。Samsara想知道他的馬最少需要跳幾次才能吃掉Staginner的將(我們假定其不會(huì)移動(dòng))。當(dāng)然這個(gè)光榮的任 務(wù)就落在了會(huì)編程的你的身上了。
Input
每組數(shù)據(jù)一行,分別為六個(gè)用空格分隔開的正整數(shù)n,m,x1,y1,x2,y2分別代表棋盤的大小n,m,以及將的坐標(biāo)和馬的坐標(biāo)。(1<=x1,x2<=n<=20,1<=y1,y2<=m<=20,將和馬的坐標(biāo)不相同)
Output
輸出對(duì)應(yīng)也有若干行,請(qǐng)輸出最少的移動(dòng)步數(shù),如果不能吃掉將則輸出“-1”(不包括引號(hào))。
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; }總結(jié)
以上是生活随笔為你收集整理的CSU 1224 ACM小组的古怪象棋的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当对手有 45 亿资金、1 亿用户,你怎
- 下一篇: 红宝书读书笔记 第八章