C++簡易理論模型:DFS深搜法破解安卓手機鎖

今天吃完晚飯突然想到手機鎖如何破開,以前一直認爲它只有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 請按任意鍵繼續. . .




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章