博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hiho_1054_滑动解锁
阅读量:6240 次
发布时间:2019-06-22

本文共 2717 字,大约阅读时间需要 9 分钟。

题目大意

    智能手机九点屏幕滑动解锁,如果给出某些连接线段,求出经过所有给出线段的合法的滑动解锁手势的总数。题目链接: 

题目分析

    首先,尝试求解没有给定线段情况下,所有合法的路径的总数。可以使用dfs进行搜索。代码如下:

void dfs(int row, int col, int cur_len) {	visited[row][col] = true;	if (cur_len >= 4) { //到达该点时,走过的路径长度大于等于4,则为合法的一个解锁手势		total_count++;	}	if (cur_len == 10)		return;	for (int i = 0; i < 3; i++) {		for (int j = 0; j < 3; j++) {			int next_row = (row + i) % 3;			int next_col = (col + j) % 3;			if (!visited[next_row][next_col]) {		    //可能出现当前点和下一个点的连线上经过了另一个点的情况,进行判断。如果		    //经过的另一个点之前被访问过,则这次仍然是合法的。				if (abs(row - next_row) == 2 && abs(col - next_col) != 1 ||					abs(col - next_col) == 2 && abs(row - next_row) != 1) {					int mid_row = (row + next_row) / 2;					int mid_col = (col + next_col) / 2;					if (!visited[mid_row][mid_col]) {						continue;					}				}				int cur = 3 * row + col;				int next = 3 * next_row + next_col;					dfs(next_row, next_col, cur_len + 1, need_use, cur_used + 1);			}		}	}	visited[row][col] = false;}

 

在上面的dfs搜索基础上,添加对已有线段的限制。9个点,维护 connected[9][9], connected[i][j] 表示已经有线段将i和j连接。搜索的时候,还需要维护状态,cur_used表示当前已经经过了已有线段的数目,如果已经经过了所有的线段。且当前路径经过点数大于等于4,则是一个合法的解锁路径。

实现

#include
#include
#include
using namespace std;bool visited[3][3];bool connected[9][9];int total_count;//cur_len 为到达row,col点时候,路径的长度; cur_used表示已经走过的路径所覆盖的已有线段的个数void dfs(int row, int col, int cur_len, int need_use, int cur_used) { visited[row][col] = true; if (cur_len >= 4 && need_use == cur_used) { total_count++; } if (cur_len == 10) return; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int next_row = (row + i) % 3; int next_col = (col + j) % 3; if (!visited[next_row][next_col]) { if (abs(row - next_row) == 2 && abs(col - next_col) != 1 || abs(col - next_col) == 2 && abs(row - next_row) != 1) { int mid_row = (row + next_row) / 2; int mid_col = (col + next_col) / 2; if (!visited[mid_row][mid_col]) { continue; } } int cur = 3 * row + col; int next = 3 * next_row + next_col; if(connected[cur][next]) dfs(next_row, next_col, cur_len + 1, need_use, cur_used + 1); else dfs(next_row, next_col, cur_len + 1, need_use, cur_used); } } } visited[row][col] = false;}void GetCount(int need_use) { for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { dfs(row, col, 1, need_use, 0); } }}int main() { memset(visited, false, sizeof(visited)); int T, need_use, u, v; scanf("%d", &T); while (T--) { total_count = 0; memset(connected, false, sizeof(connected)); scanf("%d", &need_use); for (int i = 0; i < need_use; i++) { scanf("%d %d", &u, &v); connected[u-1][v-1] = connected[v-1][u-1] = true; } GetCount(need_use); printf("%d\n", total_count); } return 0;}

 

转载地址:http://hjdia.baihongyu.com/

你可能感兴趣的文章
WCf客户端测试
查看>>
Java线程面试题 Top 50
查看>>
java内存模型
查看>>
python继承关系及DVD案例
查看>>
木其工作室代写程序 [原]使用Filter过滤ip禁止访问系统
查看>>
2.6 The Object Model -- Bindings
查看>>
2.4 The Object Model -- Computed Properties and Aggregate Data with @each(计算的属性和使用@each聚合数据)...
查看>>
二叉树问题(区间DP好题)
查看>>
PHP基础
查看>>
PHP奇淫技巧
查看>>
Centos中配置环境变量
查看>>
mysql中判断记录是否存在方法比较【转】
查看>>
HBase 列族的概念
查看>>
hdu2036
查看>>
基于模板匹配的马赛克检验
查看>>
Database4.exe用来导入excel
查看>>
Unable to preventDefault inside passive event listener
查看>>
java中string和int互相转化 (转)
查看>>
[LUOGU] P1220 关路灯
查看>>
【转】在控制台、WinForm项目中的嵌入mdf文件的烦恼
查看>>