【ブルーブリッジ杯試験前突撃】第11回ブルーブリッジ杯校試合シミュレーションC/C++種草


    
         ,          n   m     ,           1。
               ,    ,           。
         ,   ,         ,         ,        、 、 、        ,               。
       ,k             。
    
               n, m。
      n  ,     m    ,         ,        。      ,     ,      g,     。
            k。
    
     n  ,     m    ,   k         。      ,     ,      g,     。
    
4 5
.g...
.....
..g..
.....
2
    
gggg.
gggg.
ggggg
.ggg.
         
     30%      ,2 <= n, m <= 20。
     70%      ,2 <= n, m <= 100。
          ,2 <= n, m <= 1000,1 <= k <= 1000。
       
  dp  
      
       
  dfs  bfs
dfs         
    
#include
using namespace std;
string maze[1005];//      
int p[1005];//           
bool dp[1005][1005];//         
int n,m,k;
int a[4][2]={
     {
     -1,0},{
     0,-1},{
     1,0},{
     0,1}};//     
bool in(int x,int y){
     
	return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y,int step){
     
	if(step==k){
     
		return;
	}
	dp[x][y]=true;
	//     
	for(int i=0;i<4;i++){
     
		int tx=x+a[i][0];
		int ty=y+a[i][1]; 
		if(in(tx,ty)&&!dp[tx][ty]){
     
			maze[tx][ty]='g';
			dp[tx][ty]=true;
			dfs(tx,ty,step+1);
			dp[tx][ty]=false;
		}
	}
	dp[x][y]=false;
}
int main(){
     
	cin>>n>>m;
	for(int i=0;i<n;i++){
     
		cin>>maze[i];
	}
	cin>>k;
	//           
	for(int i=0;i<n;i++){
     
		for(int j=0;j<m;j++){
     
			if(maze[i][j]=='g'){
     
				p[i]=j;
			}
		}
	}
	//              
	for(int i=0;i<n;i++){
     
		if(p[i]!=0){
     
			dfs(i,p[i],0);
		}
	}
	for(int i=0;i<n;i++){
     
		cout<<maze[i]<<endl;
	}
	return 0;
}
٩(๑❛ᴗ❛๑)۶