笔试题目:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100+10;
int arr[6][6];
int vis[6][6];
int xx,yy;
int res=0;
//空位 0 黑棋1 走过2
int findx(int x, int y, int dir){
if(!dir){
x--;
for(int i=x;i>=1;i--){
if(vis[i][y]==1){
return i;
}
}
}else{
x++;
for(int i=x;i<=5;i++){
if(vis[i][y]==1){
return i;
}
}
}
return 0;
}
int findy(int x, int y, int dir){
if(dir){
y++;
for(int i=y;i<=5;i++){
if(vis[x][i]==1){
return i;
}
}
}else{
y--;
for(int i=y;i>=1;i--){
if(vis[x][i]==1){
return i;
}
}
}
return 0;
}
void dfs(int x, int y){
int d;
//上
d=findx(x,y,0);
d=2*abs(x-d);
if(d && x-d>=1 && !vis[x-d][y]){
res=max(res,abs(x-d-xx)+abs(y-yy));
vis[x-d][y]=2;
dfs(x-d,y);
}
//下
d=findx(x,y,1);
d=2*abs(x-d);
if(d &&x+d<=5 && !vis[x+d][y]){
res=max(res,abs(x+d-xx)+abs(y-yy));
vis[x+d][y]=2;
dfs(x+d,y);
}
//左
d=findy(x,y,0);
d=2*abs(x-d);
if(d && y-d>=1 && !vis[x][y-d]){
res=max(res,abs(x-xx)+abs(y-d-yy));
vis[x][y-d]=2;
dfs(x,y-d);
}
//右
d=findy(x,y,1);
d=2*abs(x-d);
if(d && y+d<=5 && !vis[x][y+d]){
res=max(res,abs(x-xx)+abs(y+d-yy));
vis[x][y+d]=2;
dfs(x,y+d);
}
}
int main(){
cin>>xx>>yy;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
cin>>arr[i][j];
if(arr[i][j]){
vis[i][j]=1;
}
}
}
xx++;
yy++;
vis[xx][yy]=2;
dfs(xx,yy);
cout<<res<<endl;
return 0;
}