12顔の質問パス行列
マトリックス内の文字列のすべての文字を含むルートがあるかどうかを決定する機能を設計してください。経路は、細胞のマトリックスのいずれかから開始することができ、行列の各ステップは、右、上及びグリッドの移動下、左することができます。グリッドマトリックス次々パスした場合、パスは再びグリッドを入力することはできません。例えば、3×4次の行列における「bfce」パスを含む文字列(パスは、太字で示されます)。
[[「」、「B」、「C」、「E」]、
[「S」、「F」、「C」、「S」]、
[「」、「D」、「E」、 「E」]]
文字列Bが第2のグリッドの後の最初の行列の最初の行を占めるしかし、「abfb」パス文字列が含まれていないマトリックスは、グリッドが再びパスを入力することができません。
例1:
入力:ボード= [ "A" 、 "B"、 "C"、 "E"]、[ "S"、 "F"、 "C"、 "S"]、[ "A"、 "D"、 "E"、 "E"] ]、単語= "ABCCED"
出力:真
例2:
入力:ボード= [[ "" 、 "B"]、[ "C"、 "D"は]]、単語= "ABCD"
偽:出力
ヒント:
1 <= board.length <= 200
1 <=ボード[I] .LENGTH <= 200
思考
バックトラック。
ノートにリアライズのものを移動します。
パラメータ値は、引数の値に影響を与えるので、スライスポインタが実際に送信された時刻を渡すパラメータ機能を行きます。
C ++ / Javaでは、トランスファーベクターまたは配列は、引数には影響しない仮パラメータのコピーを作成することです。
したがってC ++ / Javaを使用して直接操作ボードに渡すことができるが、移動は、マトリックス記録状態の確立に加えて、必要とされます。
行って下質量参加実験、あなたが興味を見ることができます。
私の答え
func exist(board [][]byte, word string) bool {
for i:=0;i<len(board);i++{
for j:=0;j<len(board[0]);j++{
mark:=make([][]bool,len(board))
for k:=0;k<len(board);k++{
mark[k]= make([]bool,len(board[0]))
}
if search(board,mark,i,j,word){
return true
}
}
}
return false
}
func search(board [][]byte,mark [][]bool,i,j int,word string)bool{
if len(word)==0{
return true
}
if i<len(board)&&i>=0&&j<len(board[0])&&j>=0{
if mark[i][j]==false&&board[i][j]==byte(word[0]){
mark[i][j]=true
down:=search(board,mark,i+1,j,word[1:])
up:=search(board,mark,i-1,j,word[1:])
right:=search(board,mark,i,j+1,word[1:])
left:=search(board,mark,i,j-1,word[1:])
if down||up||right||left{
return true
}else{
mark[i][j]=false
}
}
}
return false
}
ミサの参加実験
ゴー
コード:
package main
import "fmt"
func main() {
a:=[]int{1,2,3}
fmt.Println(a)
modify(a)
fmt.Println(a)
}
func modify(a []int) {
a[0]=4
}
結果:
C ++
#include <iostream>
#include <vector>
using namespace std;
void modify(vector<int> nums) {
nums[0] = 4;
}
void printVector(vector<int> nums) {
for (int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
}
int main()
{
vector<int>nums = { 1,2,3 };
printVector(nums);
cout << endl<<"--------" << endl;
modify(nums);
printVector(nums);
return 0;
}
結果: