社区讨论
50Pts求调,悬一关
P1606[USACO07FEB] Lilypad Pond G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlm9mnvc
- 此快照首次捕获于
- 2026/02/14 20:01 5 天前
- 此快照最后确认于
- 2026/02/18 13:40 昨天
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int x,y,ans;
};
deque<node> q;
int n,m;
int a[40][40];
int f[40][40];
int num[100][100];
int tx[]={-2,-2,-1,-1,1,1,2,2};
int ty[]={-1,1,-2,2,-2,2,-1,1};
void bfs(int x,int y){
q.push_back({x,y,0});
f[x][y]=0;
num[x][y]=1;
while(!q.empty()){
node k=q.front();
q.pop_front();
for(int i=0;i<8;i++){
int X=k.x+tx[i],Y=k.y+ty[i];
if(!(X>0&&X<=n&&Y>0&&Y<=m))continue;
if(!a[X][Y]){
if(k.ans+1<f[X][Y]){
f[X][Y]=k.ans+1;
num[X][Y]=num[k.x][k.y];
q.push_back({X,Y,k.ans+1});
}
else if(k.ans+1==f[X][Y]){
num[X][Y]+=num[k.x][k.y];
}
}
if(a[X][Y]==4||a[X][Y]==1||a[X][Y]==3){
if(k.ans<f[X][Y]){
f[X][Y]=k.ans;
num[X][Y]=num[k.x][k.y];
q.push_front({X,Y,k.ans});
}
else if(k.ans==f[X][Y]){
num[X][Y]+=num[k.x][k.y];
}
}
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];
memset(f,0x7f,sizeof(f));
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]==3)bfs(i,j);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]==4){
if(f[i][j]==0x7f){
cout<<-1;
}
else{
cout<<f[i][j]<<'\n'<<num[i][j];
}
}
return 0;
}
/*
hack.in
7 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 2 0 1 1 1 0 2 0 0 0 0
0 0 3 0 0 0 1 0 1 0 0 0 4 0 0
0 0 0 0 2 0 1 1 1 0 2 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
hack.out
4
36
*/
回复
共 0 条回复,欢迎继续交流。
正在加载回复...