(简单、大量) 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


原创粉丝点击