社区讨论

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 条回复,欢迎继续交流。

正在加载回复...