残缺的棋盘

本文介绍了一种用于解决棋盘上两点间最短路径问题的算法。通过判断两点位置关系,选择不同方向进行搜索,并考虑可能遇到的障碍物,计算出从起点到终点所需的最小步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdio>
#include<iostream>
#include<math.h>
using namespace std;
int board[8][8]={0},min = 999999,visit[8][8]={0};
int  r1, c1, r2, c2, r3, c3;
int swap(int *a,int *b)
{
int t = *a;*a = *b;*b = t;
}
int search( )
{
int count = 0,min = 0,max = 0,q = 0;
if(c1 >= c2)//向左上方 
{
//printf("zou%d %d %d %d\n",r1,c1,r2,c2);
q = min = ( c1 - c2 > r2 - r1 ) ? r2 - r1 : c1 - c2;//沿对角线走的步数 
max = ( c1 - c2 < r2 - r1 ) ? r2 - r1 : c1 - c2;//向左或向上 
count += min; 
while( min-- )
{
r1++,c1--;
if(r2 - r1 == c1 - c2 && (r1 == r3 && c1 == c3))//碰到障碍并且无法避免 
count += 1; 
}
// printf("%d %d\n",q,count);
count += max - q;//减去已经走的
}
else if(c1 < c2)//向右上方 
{
//printf("you%d %d %d %d\n",r1,c1,r2,c2);
q = min = ( c2 - c1 > r2 - r1 ) ? r2-r1 : c2-c1;
max = ( c2 - c1 < r2 - r1 ) ? r2-r1 : c2-c1;//向左或向上 
count += min; 
while( min-- )
{
r1++,c1++;
if( r2 - r1 == c2 - c1 && r1 == r3 && c1 == c3)//碰到障碍并且无法避免 
count += 1; 
}
count += max - q;//减去已经走的
}
return count;
}
int main()
{
int k = 0;
while(cin>>r1>>c1>>r2>>c2>>r3>>c3){
int count = 0;
if(r1 == r2 || c1 == c2)//在同一行或列 
{
if(r1==r2)//同一行 
{
count += fabs(c1-c2);
}
else//同列 
{
count += fabs(r1-r2);
}
cout <<"Case"<<" "<< ++k<< ":"<<" "<<count<<endl;
continue;
}
//不在同行或列 
if(r1 > r2)//将下方点变为起始点 
{
swap(&r1,&r2);
swap(&c1,&c2);
}
cout <<"Case"<<" "<< ++k<< ":"<<" "<<search()<<endl;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值