再簡單說明一下題意,規定一開始按鈕狀態為0 0 0 0 0 0,輸入終點狀態,求最少的操作步數,對於每個按鈕,有以下規定:
按鈕①:可以任意想順時針或者逆時針旋轉,一次轉動一格
按鈕②:當6個旋鈕的數字中奇數偶數個數為相同時才能轉動,向順時針或者逆時針轉動一格
按鈕③:只能向逆時針方向轉動,一次轉動7格。
按鈕④:只能向逆時針方向轉動,一次轉動(sum % 9 + 1)格,sum為當前六個數之和
按鈕⑤:當①③⑤這三個旋鈕數字之和正好為9的時候才能轉動,順時針或者逆時針旋轉一格
按鈕⑥:當按鈕②的數字為0的時候才能轉動,只能向順時針轉動,一次轉動三格。
這個題一開始反應的是能否直接用dfs並判重來做。。然而明顯不可以。
後來發現其實這肯定是個bfs的題目,進而根據題目知道終點,知道起點這個特性,想到可以用a*或者雙向bfs來做,但是不知道怎麼列啟發式函式,所以就用雙向bfs來做吧。**很長,因為正向和反向不完全一樣的判斷條件,比較坑。。。未提交過,可能有錯誤,歡迎指正。
**如下:
#include #include #include #include #include #include #include #include #include using namespace std;struct visvis[1000001];
int dis[2] = ;
struct num
};int ans[6];
int init[6];
bool judge(num a)
int total(num a)
int bfs(void)
}else if(i == 1)
if(temp != 0)
continue;
for(t = 0; t < 2; t ++)
}else if(i == 2)
else if(i == 3)
temp = temp % 9 + 1;
lst.n[3] = pre.n[3] + temp;
if(lst.n[i] < 0)
lst.n[i] += 10;
else if(lst.n[i] >= 10)
lst.n[i] -= 10;
sum = total(lst);
lst. step = pre.step + 1;
if(vis[sum].flag == 1)
continue;
if(vis[sum].flag == 2)
return lst.step + vis[sum].step;
vis[sum].flag = 1;
vis[sum].step = lst.step;
q.push(lst);
}else if(i == 4 && (pre.n[0] + pre.n[2] + pre.n[4] == 9))
}else if(i == 5 && pre.n[1] == 0)}}
while(p.front().step == sp)
}else if(i == 1)
}else if(i == 2)
else if(i == 3)
if(temp % 9 + 1 != i)
continue;
sum = total(lst);
lst.step = pre.step + 1;
if(vis[sum].flag == 2)
continue;
if(vis[sum].flag == 1)
return lst.step + vis[sum].step;
vis[sum].flag = 2;
vis[sum].step = lst.step;
p.push(lst);}}
else if(i == 4)
}else if(i == 5 && pre.n[1] == 0)}}
++ sp;
}return -1;
}int t;
int main(void)
if(!flag)
cout << "0" << endl;
int res = bfs();
cout << res << endl;
}return 0;
}
長安大學新生賽 H題 拉麵女神的魔盒
再簡單說明一下題意,規定一開始按鈕狀態為0 0 0 0 0 0,輸入終點狀態,求最少的操作步數,對於每個按鈕,有以下規定 按鈕 可以任意想順時針或者逆時針旋轉,一次轉動一格 按鈕 當6個旋鈕的數字中奇數偶數個數為相同時才能轉動,向順時針或者逆時針轉動一格 按鈕 只能向逆時針方向轉動,一次轉動7格。按...
2017 湘潭大學邀請賽H題 Highway
題目傳送門 賽後感慨 大一的我,去參加湘潭大學邀請賽還是比較興奮的,我知道自己學校的實力並不強,所以並沒有抱著能拿獎的心態去的,當時的我對於acm也只是盲目的熱愛,因為這次湘潭大學邀請賽,也讓我看到了自己學校與其他學校的真正差距,也明白了自己究竟想要什麼 我想要的是能為學校拿獎 也為自己 能讓自己足...
哈爾濱理工大學2016新生賽K題
小明這個人特別無聊,他喜歡把乙個字串以乙個奇怪的姿勢壓縮起來。他會把連續的字元表示成字元和數字的形式,而且他用的數字還都是一位的!比如下面這個例子 a12 表示的是 aaaa 也就是說壓縮後的字串裡的每個數字表示重複最後乙個出現的字元數字次,就好像上面的例子。現在給你一些被無聊的小明壓縮過的字串,你...