poj1657——Distance on Chessboard

没多想,直接敲的BFS,看了discuss,表示很惭愧,居然没动脑,敲了NC的BFS,这得多敲多少代码呀...

#include<iostream> #include<cstdio> #include<cstring> using namespace std; bool vis[10][10]; char star[3],end[3]; struct go_to { int x,y,step; }tt[3],queue[1000]; int dir[][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1}}; int rear=0,front=0; void solve1() { rear=0;front=0; rear++; queue[rear].x=tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i; while(front!=rear) { front++; for(i=0;i<8;i++) { int tempx=queue[front].x +dir[i][0]; int tempy=queue[front].y+dir[i][1]; if(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d ",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } } } } printf("Inf "); } void solve2() { rear=0;front=0; rear++; queue[rear].x =tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i,j,k; while(front!=rear) { front++; for(i=0;i<8;i++) { int tempx=queue[front].x+dir[i][0]; int tempy=queue[front].y+dir[i][1]; while(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d ",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } tempx=tempx+dir[i][0]; tempy=tempy+dir[i][1]; } } } printf("Inf "); } void solve3() { rear=0;front=0; rear++; queue[rear].x =tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i,j,k; while(front!=rear) { front++; for(i=0;i<4;i++) { int tempx=queue[front].x+dir[i][0]; int tempy=queue[front].y+dir[i][1]; while(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d ",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } tempx=tempx+dir[i][0]; tempy=tempy+dir[i][1]; } } } printf("Inf "); } void solve4() { rear=0;front=0; rear++; queue[rear].x =tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i,j,k; while(front!=rear) { front++; for(i=4;i<8;i++) { int tempx=queue[front].x+dir[i][0]; int tempy=queue[front].y+dir[i][1]; while(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d\n",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } tempx=tempx+dir[i][0]; tempy=tempy+dir[i][1]; } } } printf("Inf\n"); } void solve() { solve1(); solve2(); solve3(); solve4(); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s%s",&star,&end); tt[0].x=star[0]-'a'+1;tt[0].y=star[1]-'0'; tt[1].x=end[0]-'a'+1;tt[1].y=end[1]-'0'; if(tt[0].x==tt[1].x&&tt[0].y==tt[1].y) printf("%d %d %d %d\n",0,0,0,0); else solve(); } return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值