今天吃完晚飯突然想到手機鎖如何破開,以前一直認爲它只有9個點,總感覺它不見得怎麼中用,只不過在普通人眼裏看來很強大而已,今天一試,果然破解了~~~~HiaHia!!
過會去上自習,下面簡略說下模型:
1 2 3
4 5 6
7 8 9
有三種點,角上的點(1、3、7、9),邊中的點(2、4、6、8),中心點(5)。
把它們相互之間連接的關係矩陣如下給出
bool Graph[9][9] =
{{0,1,0,1,1,1,0,1,0},
{1,0,1,1,1,1,1,0,1},
{0,1,0,1,1,1,0,1,0},
{1,1,1,0,1,0,1,1,1},
{1,1,1,1,0,1,1,1,1},
{1,1,1,0,1,0,1,1,1},
{0,1,0,1,1,1,0,1,0},
{1,0,1,1,1,1,1,0,1},
{0,1,0,1,1,1,0,1,0}};
直接用DFS深搜破解,探測函數如下
bool Detect(int point)
{
if(TestRoute == ActualRoute)return true;
if(TestRoute.size() == ActualRoute.size())return false;
for(int i=1; i<=9; ++i)
{
if ((true == Graph[point-1][i-1]) && //Able to connnect
(TestRoute.end() == find(TestRoute.begin(), TestRoute.end(), i)) //Not included in Test Route
)
{
TestRoute.push_back(i);
if(Detect(i))return true;
TestRoute.pop_back();
}
}
return false;
}
最後直接做個簡單的測試即可#include "stdafx.h"
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
vector<int> TestRoute, ActualRoute ;
bool Graph[9][9] =
{{0,1,0,1,1,1,0,1,0},
{1,0,1,1,1,1,1,0,1},
{0,1,0,1,1,1,0,1,0},
{1,1,1,0,1,0,1,1,1},
{1,1,1,1,0,1,1,1,1},
{1,1,1,0,1,0,1,1,1},
{0,1,0,1,1,1,0,1,0},
{1,0,1,1,1,1,1,0,1},
{0,1,0,1,1,1,0,1,0}};
bool Detect(int point)
{
if(TestRoute == ActualRoute)return true;
if(TestRoute.size() == ActualRoute.size())return false;
for(int i=1; i<=9; ++i)
{
if ((true == Graph[point-1][i-1]) && //Able to connnect
(TestRoute.end() == find(TestRoute.begin(), TestRoute.end(), i)) //Not included in Test Route
)
{
TestRoute.push_back(i);
if(Detect(i))return true;
TestRoute.pop_back();
}
}
return false;
}
int main()
{
int tmp;
while(cin>>tmp)ActualRoute.push_back(tmp);
for(int start=1; start<=9; ++start)
{
TestRoute.push_back(start);
if(Detect(start))
{
cout<<"破解成功!"<<endl;
copy(TestRoute.begin(),TestRoute.end(),ostream_iterator<int>(cout," "));
TestRoute.pop_back();
break;
}
else TestRoute.pop_back();
}
ActualRoute.clear();
system("pause");
return 0;
}
最後的結果:
5 4 7 8 9 6 3 2 1^Z
破解成功!
5 4 7 8 9 6 3 2 1 請按任意鍵繼續. . .