代码是优化后的暴力:
#include<bits/stdc++.h>
using namespace std;
bool Map[15000][15000];
int miin(int a,int b,int c,int d){
int x=min(a,b);
x=min(x,c);
x=min(x,d);
return x;
}
int main(){
int rldu=0;
int n,i,j,sum=0;
scanf("%d%d%d",&n,&i,&j);
int large=n*n;
if(i==j){
printf("%d",large);
return 0;
}
int layer=miin(n-i,n-j,i,j);
i-=layer-1;
j-=layer-1;
int v=(layer-1)*2;
sum=large-(n-v)*(n-v);
n-=v;
int x=1,y=1;
while(!(x==j&&y==i)){
sum++;
if(rldu==0){
if(Map[y][x+1]>0||x+1>n){
rldu=2;
Map[y][x]=1;
y++;
continue;
}
Map[y][x]=1;
x++;
continue;
}
else if(rldu==1){
if(Map[y][x-1]>0||x-1<=0){
rldu=3;
Map[y][x]=1;
y--;
continue;
}
Map[y][x]=1;
x--;
continue;
}
else if(rldu==2){
if(Map[y+1][x]>0||y+1>n){
rldu=1;
Map[y][x]=1;
x--;
continue;
}
Map[y][x]=1;
y++;
continue;
}
else if(rldu==3){
if(Map[y-1][x]>0||y-1<=0){
rldu=0;
Map[y][x]=1;
x++;
continue;
}
Map[y][x]=1;
y--;
}
}
printf("%d",sum+1);
return 0;
}
可以如下卡掉:
30000 30000 30000