(简单、大量) Distance on Chessboard (P1657)
来源:互联网 发布:深圳知企科技有限公司 编辑:程序博客网 时间:2024/05/21 17:31
这个题是简单单题,但是四各情况都要自己写出,虽然很相似。
#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<vector>#include<cmath>#include<set>#include<cstdlib>#include<cstring>#include<stack>#include<string>using namespace std;struct my{int x;int y;int s;bool operator==(my b){if (x==b.x&&y==b.y)return true;elsereturn false;}void put(){cout<<x<<' '<<y<<' '<<s<<endl;}my(int a=0,int b=0,int c=0){x=a;y=b;s=c;}};my from,to;int a[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};bool in(int x,int y){if (x<1||x>8||y<1||y>8)return false;return true;}int h[4][2]={{1,0},{0,1},{-1,0},{0,-1}};int xie[4][2]={{1,1},{1,-1},{-1,-1},{-1,1}};int dfs_wang(int i,int j,int s){s=0;int visit[9][9];memset(visit,0,sizeof(visit));queue<my> q;while (!q.empty())q.pop();q.push(from);visit[from.x][from.y]=1;while (!q.empty()){my cur=q.front();q.pop();//cur.put();if (cur==to)return cur.s;for (int k=0;k<8;k++){int x=cur.x+a[k][0];int y=cur.y+a[k][1];//cout<<x<<' '<<y<<endl;if (in(x,y)&&!visit[x][y]){q.push(my(x,y,cur.s+1));visit[x][y]=1;}}}return -1;}int dfs_hou(){int visit[9][9];memset(visit,0,sizeof(visit));queue<my> q;while (!q.empty())q.pop();q.push(from);visit[from.x][from.y]=1;while (!q.empty()){my cur=q.front();q.pop();if (cur==to)return cur.s;for (int k=0;k<8;k++){for (int w=1;w<8;w++){int x=cur.x+w*a[k][0];int y=cur.y+w*a[k][1];if (in(x,y)&&!visit[x][y]){q.push(my(x,y,cur.s+1));visit[x][y]=1;}}}}return -1;}int dfs_heng(){queue<my> q;while (!q.empty())q.pop();int vist[9][9];memset(vist,0,sizeof(vist));vist[from.x][from.y]=1;q.push(from);while (!q.empty()){my cur=q.front();q.pop();if (cur==to)return cur.s;for (int i=0;i<4;i++){for (int s=1;s<8;s++){int x=cur.x+s*h[i][0];int y=cur.y+s*h[i][1];if (in(x,y)&&!vist[x][y]){vist[x][y]=1;q.push(my(x,y,cur.s+1));}}}}return -1;}int dfs_xiang(){queue<my> q;while (!q.empty())q.pop();q.push(from);int vist[9][9];memset(vist,0,sizeof(vist));vist[from.x][from.y]=1;while(!q.empty()){my cur=q.front();q.pop();if (cur==to)return cur.s;for (int i=0;i<4;i++){for (int s=1;s<8;s++){int x=cur.x+s*xie[i][0];int y=cur.y+s*xie[i][1];if (in(x,y)&&!vist[x][y]){vist[x][y]=1;q.push(my(x,y,cur.s+1));}}}}return -1;}int main(){freopen("in.txt","r",stdin);int i,j,k;int cas;cin>>cas;while (cas--){char c;cin>>c>>k;from=my(c-'a'+1,k,0);cin>>c>>k;to=my(c-'a'+1,k,0);cout<<dfs_wang(from.x,from.y,0)<<' ';cout<<dfs_hou()<<' ';cout<<dfs_heng()<<' ';k=dfs_xiang();if (k==-1)cout<<"Inf";elsecout<<k;cout<<endl;}return 0;}
Distance on Chessboard
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 20819 Accepted: 7188
Description
国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:
王、后、车、象的走子规则如下:
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
王、后、车、象的走子规则如下:
- 王:横、直、斜都可以走,但每步限走一格。
- 后:横、直、斜都可以走,每步格数不受限制。
- 车:横、竖均可以走,不能斜走,格数不限。
- 象:只能斜走,格数不限。
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
Input
第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。
Output
对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".
Sample Input
2a1 c3f5 f8
Sample Output
2 1 2 13 1 1 Inf
Source
POJ Monthly--2004.05.15 Liu Rujia@POJ
- (简单、大量) Distance on Chessboard (P1657)
- POJ1657-Distance on Chessboard
- Distance on Chessboard
- Distance on Chessboard 1657
- POJ1657--Distance on Chessboard
- 1657-Distance on Chessboard
- Distance on Chessboard POJ
- poj1657——Distance on Chessboard——简单题
- POJ 1657 Distance on Chessboard 简单的计算问题
- PKU 1657 Distance on Chessboard
- poj 1657 Distance on Chessboard
- poj 1657 Distance on Chessboard
- poj 1657 Distance on Chessboard
- Poj 1657 Distance on Chessboard
- POJ 1657 (Distance on Chessboard)
- poj 1657 Distance on Chessboard
- poj 1657 Distance on Chessboard
- POJ 1657 Distance on Chessboard
- eclipse 整合三大框架
- TED
- Socket编程中的强制关闭与优雅关闭及相关socket选项
- 二分匹配题集
- 春江花月夜
- (简单、大量) Distance on Chessboard (P1657)
- 我的助理辞职了---最近非常火的一篇文章,受益颇多
- 工欲善其事,必先利其器。。。
- 如何绑定PAYPAL(Token)帐号
- qboxlayout与qt布局(一)
- Ubuntu 10.04安装android NDK
- 使用 CXF 做 webservice 简单例子
- expdp 导出简单笔记
- python对XML的解析