intさわだんのBlack History

刹那的レジェンドになりたい。

AOJ0558 チーズ

これほど汚いソースを見たことがない。
戒めのためにはります。

#include <cstdio>
#include <queue>
#include <cstdlib>

using namespace std;

int h,w,n;

int nx,ny;

int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};

int ans = 0;

char m[1003][1003];

void search(int ty,int tx,char goal){

int  goal2 = goal + '0';

bool ch[1002][1002] = {};

int sum = 0;
	
queue<int> xx;
queue<int> yy;

xx.push(tx);
yy.push(ty);
ch[ty][tx] = true;

while(xx.size()){

int sss = xx.size();
for(int ii = 0;ii < sss;ii++){


int xxx = xx.front(); xx.pop();
int yyy = yy.front(); yy.pop();


	if(m[yyy][xxx] == goal2){
		
		ans += sum;
		ny = yyy,nx = xxx;
		
		goto out;
	}
	
	for(int i = 0;i < 4;i++){
		int fy = yyy + dy[i];
		int fx = xxx + dx[i];
		
		if(fy >= 0 && fy < h && fx >= 0 && fx < w && m[fy][fx] != 'X' && ch[fy][fx] == false){
		yy.push(fy);
		xx.push(fx);
		ch[fy][fx] = true;
		}
		
	}
	}
	sum++;
}

out:
;
	
	
	

}





int main(){
	
	scanf("%d%d%d",&h,&w,&n);
	
	for(int i = 0;i < h;i++){
		scanf("%s",&m[i]);
	}
	
	for(int i = 0;i < h;i++){
		for(int j = 0;j < w;j++){
			if(m[i][j] == 'S'){
				nx = j;
				ny = i;
				goto out;
			}
		}
	}
	
	out:
	;
	
	
	for(int i = 1;i <= n;i++){
		search(ny,nx,(char)i);
	}
	
	printf("%d\n",ans);
	
	
	
	return 0;
	
}