これがエンコーディングテストです.実装1

39992 ワード

符号化テストでは,実装は頭の中のアルゴリズムをソースコードに変換する過程である.
実装タイプの問題は、プールが容易に考えられることを意味しますが、ソースコードに移行するのは難しいです.(物理的要件)
この本では,完全探索,シミュレーションも実装タイプに属する.

例4-1上下左右


旅行者はN*Nサイズの正方形の空間に立っています.このとき開始座標が1、1で、次の行でL、R、U、Dの問題が繰り返され、正方形空間からの移動は無視されます.このとき最終座標を求める
実装コード:
import java.util.*;

public class Main{
	 static int[] dx ={0, 0, -1, 1};
     static int[] dy ={-1, 1,0 , 0};
     static String[] dmove ={"L", "R", "U" ,"D"};
	public static void main(String args[]){
    	Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
		sc.nextLine();
        String[] move = sc.nextLine().split(" ");
        int x = 1;
        int y = 1;
        
        for(String mv : move ){
        	int xtemp = -1;
        	int ytemp = -1;
        	for(int i = 0; i < 4 ; i++){
            	if(dmove[i].equals(mv)){
                	xtemp = x + dx[i];
                    ytemp = y + dy[i];
                }
            }
            
            if(xtemp < 1 || xtemp > n || ytemp < 1 || ytemp > n){
            	continue;
            }
            x = xtemp;
            y = ytemp;
        }
        
        System.out.println(x+" "+y);
    }

}
コードの説明:
L,R,U,Dがあるので配列に入れてdx,xy値で遊ぶ.
入力値に基づいて座標を移動すると、座標から離れるのは無効になります.
if(xtemp<1|xtemp>n|ytemp<1|ytemp>n)条件を追加します.

例4-2視野角


質問概要:整数Nを入力する場合は、00時00分00秒からN時59分59秒までのすべての時刻のうち、1つの時刻に3が含まれていても、任意の数の数字(0時00分00秒からN時59分59秒まで)を計算するプログラムを作成します.
実装コード:
import java.util.*;
public class Main{
	
	public static boolean check(int h, int m, int s){
    	if(h % 10 == 3 || m % 10 == 3 || m / 10 == 3 || s % 10 == 3 || s / 10 ==3){
        	return true;
        }
        return false;
    }
	public static void main(String args[]){
    	Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int cnt = 0;
        for(int i = 0; i <= n; i++){
        	for(int j = 0 ; j < 60; j ++){
            	for(int k = 0;k < 60; k++){
                	if(check(i, j, k)) cnt++;
                }
            }
        }
        System.out.println(cnt);	
    }
}
コードの説明:
これは,00時00分00秒からN時59分59秒まで,水中に3を含むすべての場合の求数問題である.完全に探索問題と考えられる.24時までやっても86400個しかないので、タイムアウトの問題は考える必要はありません.
3を含むかどうかを確認する方法は、時間を10に分ける残り時間が3の場合、分を10に分ける残り時間を3、分、秒を10に分けるシェアが3の場合です.

実戦問題.王室の夜


質問の概要:

例えば、座標がa 1である場合、ナイトが移動できる問題をどのように求めるか.
答えは2です.
実装コード:
package test;
import java.io.*;
import java.util.*;

public class Main{
	public static void main(String args[]) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//StringTokenizer st = new StringTokenizer(br.readLine(),"");
		String str = br.readLine();
		int y = str.charAt(0)- 96;
		int x = str.charAt(1) -'0';
		int[] dy = {-1, 1, -1, 1, -2, 2, -2, 2};
		int[] dx = {2, 2, -2, -2, 1, 1, -1, -1};
		int cnt = 0;
		for(int i = 0; i < 8 ; i++){
			int ny = y +dy[i];
			int nx = x +dx[i];
			if(ny < 1 || ny > 8 || nx < 1 || nx > 8) continue;
			cnt ++;
		}
		System.out.println(cnt);
	}
}
コードの説明:
BufferedReaderはScannerよりもスピードが速いので、練習と同時に練習もしました.
まず、1行を読み、charatで各文字を1行に分けてx、y座標を求め、8つの方法でナイトを移動させることができるが、座標を超えないようにしてから値cntを行う.

実戦問題.ゲーム開発


質問の概要:
ヘミンはゲームキャラクターが地図を移動するシステムを開発している.キャラクターがいる場所は、1×1サイズの正方形からなるN×Mサイズの長方形で、各格子は陸か海です.キャラクターは東西南北から一つの場所を眺めている.
地図上の各格子は(A,B)で表すことができ、Aは北から来た格子の個数、Bは西から来た格子の個数である.キャラクターは上下左右に移動でき、海の空間に入ることはできません.キャラクターの動きを設定するためのマニュアルは以下の通り.
現在位置では、現在方向を基準に左方向(反時計回りに90度回転する方向)から順に行き先を決めます.
キャラクターの真左にまだ行ったことのない格子がある場合は、左側に折りたたんで左に1段進みます.左方向に未通過の格子がない場合は左方向のみ回転し、第1段階に戻る.
4つの方向がすでに行ったか海の格子であれば、眺める方向を保ち、後ろに1つの格子を歩いて第1段階に戻ります.しかし、このとき後ろの方向が海の格子になっていて、後ろに進めないと移動が止まってしまいます.
ヘミンはこのような過程を繰り返し、キャラクターの移動に異常があるかどうかをテストしようとした.メニューに従ってロールを移動した後、ロールがアクセスするセル数を出力するプログラムを作成します.
入力
1行目に、スペースで区切られた一覧図の縦サイズNと横サイズMを入力します.
(3 <= N, M <= 50)
2行目では、ゲームキャラクターがいるセルの座標(A,B)と、眺めている部屋dがそれぞれスペースで区切られている.方向dの値は4種類あります.
0:北
1:東
2:南方
3:西洋
3行目から地図が陸地なのか海なのかの情報を与えます.N行では,地図の状態は北から南へ順次与えられ,各行のデータは西から東へ順次与えられる.地図の外角はいつも海です.
0:陸地
1:海
最初のゲームキャラクターが置かれていた格子状態は常に陸だった.
しゅつりょく
最初の行の移動が完了すると、ロールがアクセスするセルの数が出力されます.
入力例
4 4
1/0/(1,1)北向き(0)のキャラクター
1 1 1 1
1 0 0 1
1 1 0 1
1 1 1 1
出力例
3

実装コード:

package test;
import java.io.*;
import java.util.*;

public class Main{
	public static int[][] map
	public static int[] dx = {-1, 0, 1, 0};
	public static int[] dy = {0, -1, 0, 1};
	public static int[][] visited
	public static int direction;
	public static void turnLeft(){
		direction++;
		if(direction == 4) direction = 0;
	}
	public static void main(String args[]) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		int x = Integer.parseInt(st.nextToken());
		int y = Integer.parseInt(st.nextToken());
		direction = Integer.parseInt(st.nextToken());
		map = new int[n][m];
		visited = new int[n][m];
		for(int i = 0;i < n;i++){
			st = new StringTokenizer(br.readLine());
			for(int j = 0;j < m; j++){
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		int cnt = 1;
		visited[x][y] = 1;
		int turnCount = 0;
		while(true){
			turnLeft();
			int nx = x + dx[direction];
			int ny = y + dy[direction];
			if(map[nx][ny] == 0 && visited[nx][ny] == 0){
				visited[nx][ny] = 1;
				x = nx;
				y = ny;
				cnt += 1;
				turnCount = 0;
				continue;
			} else {
				turnCount += 1;
			}
			
			if(turnCount == 4){
				nx = x - dx[direction];
				ny = y - dy[direction];
				if(map[nx][ny] == 0){
					x = nx;
					y = ny;
				}else {
					break;
				}
				turnCount = 0;
			}
		}
		
		 System.out.println(cnt);
	}
}
コードの説明:
BufferedReaderとStringTokenizerを使用して入力値を受信します.実施は問題条件と同じであるが,最初の問題を理解するのは容易ではない.
この問題は典型的な静力学問題であり,この問題は方向を設定することによってその方向を決定することができる.
まず北を0にし,dx,dyを配列に順番に格納し,南,東の順に格納する.1回転ごとに、その値を++に設定し、4になると0になります.
また、左に曲がって前に進んで、海かどうかを判断してから行けばいいです.アクセス回数、初期化回転回数、アクセス回数++を表示します.
そうでなければ、回転します.回転数が4なら後ろに行けるかどうか判断し、海なら止めて後ろに行けるなら後ろに進む.