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这个就是典型的走迷宫模板了,就不多说啥啦,不会的体会一下吧