其實就是我們經常玩的貪吃蛇。
不過現在我們優先蛇的頭的話,要用乙個巧妙的雜湊來把蛇的身體表達出來,那麼就可以用乙個4進製的數字來表示,蛇的身體長度最多不超過8,所以最多是2^7種狀態。
1 #include2 #include3 #include4 #include5 #include6view codeintconst n = 8;7
intconst m = 22;8
intconst state = 17000;9
struct
snake
10cur,nt;
14 snake q[1000000
];15
inthead,tail;
16int
n,m,l,x,y,ans,s;
17bool
map[m][m],vis[m][m][state];
18int dirx=;
19int diry=;
20bool judge(int x,int
y)21
24int check(int x1,int y1,int x2,int
y2)25
33else
3440}41
intbfs()
4266
if(f)continue;67
for(int j=l-1;j>0;j--)
68 nt.bx[j]=cur.bx[j-1],nt.by[j]=cur.by[j-1
];69
int state=0;70
for(int j=0;j1;j++)
71 state=state*4+check(nt.bx[j],nt.by[j],nt.bx[j+1],nt.by[j+1
]);72
if(!vis[nt.bx[0]][nt.by[0
]][state])
7377}78
}79return -1;80
}81intmain()
8293
for(int i=0;i)
94 scanf("
%d %d
",&cur.bx[i],&cur.by[i]);
95 scanf("
%d",&s);
96for(int i=0;i)
97101 printf("
case %d: %d\n
",++t,bfs());
102}
103return0;
104 }
POJ 1324(A 狀態壓縮)
真是好題啊,各種tle之後看了人家的解題報告才a的 1 一開始用deque儲存狀態資訊,用queue進行bfs,tle 2 試圖用陣列儲存狀態資訊,自己寫佇列進行bfs,還是tle 3 由於row和col都小於20,試圖用5 2個bit表示乙個位置,還是tle 終於看了discuss,找到了大牛的解...
POJ1376簡單廣搜
題意 給你乙個n m的矩陣,然後給你機械人的起點和終點,還有起點的方向,然後每次機械人有兩種操作,左右旋轉90度,或者是朝著原來的方向走1,2或者3步,機械人再走的過程中不能碰到格仔,也不能碰到邊界,輸出最少步數。思路 比較簡單的題目,只是要注意幾點。1 走的過程中邊界不可以碰 2 如果你想一下子走...
POJ 3278 簡單廣搜
poj3278 題意 輸入n,m,求由n到m需要最少步數,n只能加一減一或者乘二。寫的第二道廣搜題,發現用佇列就是每一種可能讀入隊尾,然後再從隊首乙個乙個的遍歷。需要做的是判斷條件和記錄步數。includeusing namespace std include include include def...