**
Description
**
在一個5×5的棋盤上有12個白色的騎士和12個黑色的騎士, 且有一個空位。在任何時候一個騎士都能按照騎士的走法(它可以走到和它橫座標相差爲1,縱座標相差爲2或者橫座標相差爲2,縱座標相差爲1的格子)移動到空位上。 給定一個初始的棋盤,怎樣才能經過移動變成如下目標棋盤: 爲了體現出騎士精神,他們必須以最少的步數完成任務。
**
Input
**
第一行有一個正整數T(T<=10),表示一共有N組數據。接下來有T個5×5的矩陣,0表示白色騎士,1表示黑色騎士,*表示空位。兩組數據之間沒有空行。
**
Output
**
對於每組數據都輸出一行。如果能在15步以內(包括15步)到達目標狀態,則輸出步數,否則輸出-1。
**
Sample Input
**
2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
**
Sample Output
**
7
-1
**
HINT
**
**
Source
**
**
Solution
**
一個水題調了一下午簡直了也是…
於是做個簽到題愉悅一下身心QAQ
這道題其實只要第一個格子確定了之後 答案就確定了QAQ
所以答案輸入一個隨機數再用3 取餘一下就能拿到不少分了= =
不過程序比隨機長不了幾行QAQ
**
Code
**
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=10010;
int a[maxn],n,ans;
bool dfs(int x,int k,int cut)
{
if(x==n&&a[x]-k-cut==0)return 1;
else if(x==n)return 0;
else if(a[x]-k-cut<0)return 0;
else return dfs(x+1,a[x]-k-cut,k);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
ans=dfs(1,0,0)+dfs(1,1,0);
printf("%d",ans);
return 0;
}
竹杖芒鞋輕勝馬 2333333[請自行腦補節奏= =]