CSU1511-残缺的棋盘-模拟/BFS

G: 残缺的棋盘

题目也是中文的,然后也没什么歧义,就不多说了。
这道题专门写下题解是因为这个题有BFS和数学推导两种思路,而且都没什么难度,放个代码供新入门的看看啦

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x0,y0,x1,y1,x2,y2,d1,d2,i=0;
    while(scanf("%d %d %d %d %d %d",&x0,&y0,&x1,&y1,&x2,&y2)!=EOF){
        d1=abs(x0-x1),d2=abs(y0-y1);
        if(d1!=d2){
            printf("Case %d: %d\n",++i,d1>d2?d1:d2);
        }else if(((x2>x1&&x2<x0)||(x2>x0&&x2<x1))&&((y2>y1&&y2<y0)||(y2>y0&&y2<y1))&&(abs(x2-x0)==abs(y2-y0))){
            printf("Case %d: %d\n",++i,d1+1);
        }else{
            printf("Case %d: %d\n",++i,d1);
        }
    }
}

直接推论是这样的:一般情况下步数就等于max(行差绝对值,列差绝对值),只有起点和终点为一条斜线并且洞在这条斜线两点中间上的时候数量为行差绝对值+1(想想为什么)

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
const int op[8][2]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};
int mp[10][10]; 
int main()
{
    ios::sync_with_stdio(false);
    int r1,c1,r2,c2,c3,r3,kase=0;
    queue<pair<pair<int,int>,int> > q;
    while(cin>>r1>>c1>>r2>>c2>>r3>>c3){
        while(!q.empty()){
            q.pop();
        }
        mem(mp,0);
        q.push(make_pair(make_pair(r1,c1),0));
        mp[r1][c1]=mp[r3][c3]=1;
        while(!q.empty()){
            int tempx=q.front().first.first,tempy=q.front().first.second,tempcnt=q.front().second;
            q.pop(); 
            if(tempx==r2&&tempy==c2){
                cout<<"Case "<<++kase<<": "<<tempcnt<<endl;
                break;
            }
            for(int i=0;i<8;++i){
                if(tempx+op[i][0]>0&&tempx+op[i][0]<9&&tempy+op[i][1]>0&&tempy+op[i][1]<9&&!mp[tempx+op[i][0]][tempy+op[i][1]]){
                    q.push(make_pair(make_pair(tempx+op[i][0],tempy+op[i][1]),tempcnt+1));
                    mp[tempx+op[i][0]][tempy+op[i][1]]=1;
                }
            }
        }
    }
    return 0;
}

BFS这个就是典型的走迷宫模板了,就不多说啥啦,不会的体会一下吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值