求调,悬关
查看原帖
求调,悬关
538683
Enoch006楼主2023/2/11 18:25

40分,真【】的开心,而且最后交一发才5分

#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[3005][3005],c[3005][3005],b[3005][3005],fx[4]={1,-1,0,0},fy[4]={0,0,-1,1},x,y;
struct node{
	int x,y,k;
};
queue<node>s;
void check(int x,int y,int kk){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(!b[i][j]||c[i][j])continue;
			if((x==i&&y==j)||(i==x-1&&j==y)||(i==x&&j==y-1)||(i==x+1&&j==y)||(i==x&&j==y+1))continue;
			if(a[i][j]==0)continue;
            else if(a[i][j]==a[x][y])s.push((node){i,j,kk+1});
			else s.push((node){i,j,kk+2});
			c[i][j]=1;
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k); 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&a[i][j]); 
	for(int i=1;i<=k;i++){
		scanf("%d%d",&x,&y);
		b[x][y]=1;
	}
	s.push((node){1,1,0});
    c[1][1]=1;
    if(b[1][1]==1)check(1,1,0);
	while(!s.empty()){
		node f=s.front();
		if(f.x==n&&f.y==m){
			cout<<f.k;
            return 0;
		}
		for(int i=0;i<=3;i++){
			int ax=f.x+fx[i];
			int ay=f.y+fy[i];
			if(c[ax][ay])continue;
			if(a[ax][ay]==0)continue;
			if(ax<1||ax>n||ay<1||ay>m)continue;
			if(b[ax][ay])check(ax,ay,f.k);
            s.push((node){ax,ay,f.k+1});
			c[ax][ay]=1;
		}
        //cout<<f.x<<" "<<f.y<<" "<<f.k<<endl;
		s.pop();
	}
	cout<<-1;
	return 0;
} 
2023/2/11 18:25
加载中...