白駿16236草?
28024 ワード
https://www.acmicpc.net/problem/16236
n*nは行列を与え,サメの位置から魚を探す問題からbfsで解決すべきであると考えられる.
最初はいつものようにbfsを使って解答しましたが、満たす条件が多くて厳しいので、ますます山に登っているような気がします.
だからすべてのコードを削除して、最初から考え直します.
これが私が考え直した結論です.
最初にbfsで食べられる魚を見つけてから次の魚を探すだけなら、問題は最短距離で、距離が同じなら条件が付いているので正解が見つからない.
だから簡単に条件を整理すると.に入力された値に9が見つかり、サメの位置を個別の変数に格納します.(sX, sY) より多くの魚が見つからない前に探索するのでwhileゲート内でbfsを開始します. bfsが開始される前に、while文で最小値を格納する変数を初期化します.(minX, minY, minDist, visit[][])
3-1. 理由は魚を見つけた後、その位置から食べ物を探し直すので、すべて初期化します.
3-2. したがって初期化する前にminx,minyの値でサメの位置を変更します. bfs内部ですべての座標をレビューし、条件を満たすとminx、minyなどを更新します.visit[]の値を移動する前に、位置からの値を1に更新すると、アクセスチェックも同時に実行できます. のすべての座標の探索が終了すると、サメが成長できるかどうかを確認し、ansに時間を費やします. コードは上記のように実行すべきだと思います.
条件がたくさんあるので、実施しにくいです.実際、問題を解く時に困難にぶつかって、いくつかのヒントを見て問題を解くしかありません.
これらの応用を解決し、問題を深化させるのに十分な基礎がないと思います.だから、基礎概念の問題を第一に考え、解決したいと思います.
小さなサメ
n*nは行列を与え,サメの位置から魚を探す問題からbfsで解決すべきであると考えられる.
最初はいつものようにbfsを使って解答しましたが、満たす条件が多くて厳しいので、ますます山に登っているような気がします.
だからすべてのコードを削除して、最初から考え直します.
コアは現在のサメの位置で食べられる魚を見つける最短距離です。
これが私が考え直した結論です.
最初にbfsで食べられる魚を見つけてから次の魚を探すだけなら、問題は最短距離で、距離が同じなら条件が付いているので正解が見つからない.
だから簡単に条件を整理すると.
3-1. 理由は魚を見つけた後、その位置から食べ物を探し直すので、すべて初期化します.
3-2. したがって初期化する前にminx,minyの値でサメの位置を変更します.
条件がたくさんあるので、実施しにくいです.実際、問題を解く時に困難にぶつかって、いくつかのヒントを見て問題を解くしかありません.
これらの応用を解決し、問題を深化させるのに十分な基礎がないと思います.だから、基礎概念の問題を第一に考え、解決したいと思います.
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static int[] dx = {0, 0, -1, 1};
static int[] dy = {1, -1, 0, 0};
static int visit[][];
static int n, s;
static int graph[][];
static int age = 2;
static int count = 0;
static int ans = 0;
static int sX, sY;
static int minX;
static int minY;
static int minDist;
static int iii = 0;
public static void main(String[] args) throws IOException {
// write your code here
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String num = br.readLine();
n = Integer.parseInt(num);
graph = new int[n][n];
for (int i = 0; i < n; i++) {
String[] tmp = br.readLine().split(" ");
for (int j = 0; j < n; j++) {
graph[i][j] = Integer.parseInt(tmp[j]);
if (graph[i][j] == 9) {
sX = i;
sY = j;
graph[sX][sY] = 0;
}
}
}
while (true) {
//초기화 하는 이유는 상어가 이동한 위치에서부터 dist를 계산해야 하기때문
visit = new int[n][n];
minX = Integer.MAX_VALUE;
minY = Integer.MAX_VALUE;
minDist = Integer.MAX_VALUE;
bfs(sX, sY);
if(minX != Integer.MAX_VALUE && minY != Integer.MAX_VALUE){
count++;
ans = ans + visit[minX][minY];
if(count == age){
age++;
count = 0;
}
graph[minX][minY] = 0;
sX = minX;
sY = minY;
}
else
break;
System.out.println("end");
}
System.out.println();
bw.write(ans + "\n");
br.close();
bw.close();
}
private static void bfs(int x, int y) {
Queue<Pair> queue = new LinkedList<>();
queue.add(new Pair(x, y));
while (!queue.isEmpty()) {
Pair p = queue.poll();
for (int i = 0; i < 4; i++) {
int newX = p.x + dx[i];
int newY = p.y + dy[i];
//이동 가능한지 검사
if ((newX >= 0 && newX <= n - 1) && (newY >= 0 && newY <= n - 1)) {
if (graph[newX][newY] <= age && visit[newX][newY] == 0) {
visit[newX][newY] = visit[p.x][p.y] + 1;
// 해당 위치 물고기 먹을 수 있는지 검사
if (graph[newX][newY] < age && graph[newX][newY] != 0) {
if (minDist > visit[newX][newY]) {
minDist = visit[newX][newY];
minX = newX;
minY = newY;
} else if (minDist == visit[newX][newY]) {
if (minX == newX) {
if (minY > newY) {
minX = newX;
minY = newY;
}
} else {
if (minX > newX) {
minX = newX;
minY = newY;
}
}
}
}
System.out.println(newX+" "+ newY+" ");
queue.add(new Pair(newX, newY));
}
}
}
}
}
}
class Pair {
public int x;
public int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
Reference
この問題について(白駿16236草?), 我々は、より多くの情報をここで見つけました https://velog.io/@estry/백준-16236-풀이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol