AOJ1501 Grid
問題リンク Grid
- 解法
a1, b1, a2, b2の値を使ってO(1)で答え出せるんじゃないかと思い、更にそれにこだわったためにコンテスト中はWA大量生産工場になってました。
座標が1000*1000までなので、2次元配列を作ることができ、ダイクストラすることができます。そうしたら、経路数をメモ化なりでカウントするだけです。
- ソース
import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; //Grid public class AOJ1501 { int r, c, si, sj, ti, tj; int[][] d = {{-1,0},{0,1},{1,0},{0,-1}}; int[][] dist, mem; int MOD = 100000007, INF = 1<<28; int get(int i, int j){ if(mem[i][j]!=-1)return mem[i][j]; int res = 0; for(int k=0;k<4;k++){ int ni = (i+d[k][0]+r)%r, nj = (j+d[k][1]+c)%c; if(dist[ni][nj] < dist[i][j])res+=get(ni, nj); } return mem[i][j] = res%MOD; } void run(){ Scanner sc = new Scanner(System.in); r = sc.nextInt(); c = sc.nextInt(); si = sc.nextInt(); sj = sc.nextInt(); ti = sc.nextInt(); tj = sc.nextInt(); dist = new int[r][c]; for(int[]a:dist)Arrays.fill(a, INF); Queue<int[]> q = new LinkedList<int[]>(); dist[si][sj] = 0; q.add(new int[]{si, sj}); while(!q.isEmpty()){ int[] V = q.poll(); for(int k=0;k<4;k++){ int ni = (V[0]+d[k][0]+r)%r, nj = (V[1]+d[k][1]+c)%c; if(dist[ni][nj]==INF){ dist[ni][nj] = dist[V[0]][V[1]]+1; q.add(new int[]{ni, nj}); } } } mem = new int[r][c]; for(int[]a:mem)Arrays.fill(a, -1); mem[si][sj] = 1; System.out.println(get(ti, tj)); } public static void main(String[] args) { new AOJ1501().run(); } }