关于leetcode中游戏相关的几道题。

碰到的第一个题就是九宫格的问题,

Valid Sudoku

determine if a Sudoku is valid, according to: http://sudoku.com.au/TheRules.aspx

The Sudoku board could be partially filled, where empty cells are filled with the character ‘.‘.

注意这里合法的九宫格的定义是:

在横行上只出现1-9的数字,且每个数字只能出现1次,在纵行上也一样。

同时9*9宫格中的9个3*3的子宫格中也只能出现在1-9中,且出现一次。

只要明白了合法九宫格的定义,代码写起来就很清晰了。

先判断横行,在判断总行,再判断那9个子宫格,判断的方法是:使用数组作为hash table. 没出现一个数字,将对应的数组中的元素个数加1,

起始为0,所以合法的九宫格不应该出现有数组元素>1的情况。

/*--------------------------九宫格问题-------------------------------*/
//By Lingtao 2015/04/21
bool isValidSudoku(vector<vector<char> > &board) {
	int number[9]; //hash table
	memset(number, 0, sizeof(number)); //初值全为0
	//判断横向是否满足。
	for (int i = 0; i < 9;i++)
	{
		for (int j = 0; j < 9;j++)
		{
			if (!isdigit(board[i][j]) && board[i][j] != '.')  //判断输入是否合法。这里可能不用判断
				return false;
			else if (board[i][j] != '.')
			{
				if (++number[board[i][j] - '0' - 1]> 1)
					return false;
			}
		}
		memset(number, 0, sizeof(number));
	}
	//判断纵向。
	for (int j = 0; j < 9; j++)
	{
		memset(number, 0, sizeof(number));
		for (int i = 0; i < 9; i++)
		{
			if (board[i][j] != '.')
				if (++number[board[i][j]-'0'-1]> 1)
					return false;
		}
	}
	//判断sub-九宫。
	int num[9];
	memset(num, 0, sizeof(num));
	for (int i = 0; i < 9; i += 3)
	{
		for (int j = 0; j < 9; j += 3)
		{
			for (int k = 0; k < 3; k++)
			{
				for (int k_j = 0; k_j < 3; k_j++)
				{
					if (board[i + k][j + k_j] != '.')
						if (++num[board[i + k][j + k_j] - '0' - 1]>1)
							return false;
				}
			}
			memset(num, 0, sizeof(num));
		}
	}
	return true;
}

未完待续。

时间: 2024-10-08 03:49:35

关于leetcode中游戏相关的几道题。的相关文章

关于leetcode中整形溢出的几道题。

题一:String to Integer (atoi) 主要是要注意这里的输入输出的特列: 题目的要求是:1 1. 前面的空格可以忽略: 2. 第一个非空格要么是整数,要么是'+','-';如过不是这些就返回0: 3. 要考虑整型溢出的情况. 大致就是这么三点 /*------------------------------------atoi -----------------------------------*/ /*LeetCode Accept 需要的测试用例: +1 1 -1 214

动态规划以及在leetcode中的应用

之前只是知道动态规划是通过组合子问题来解决原问题的,但是如何分析,如何应用一直都是一头雾水.最近在leetcode中发现有好几道题都可以用动态规划方法进行解决,就此做下笔录. 动态规划:应用于子问题重叠情况,原问题的多个子问题间可能含有相同的子子问题,当然,关于将原问题分解成子问题的思路,分治算法也是可行的,但是如果采用分治递归来解决就会出现一些问题.在重复的子问题的计算中,分治算法会忽略到重复问题,也就是说相同的问题,分治算法会计算多次,这样效率会很低.而动态规划算法会仔细安排求解顺序,对每个

Leetcode中字符串总结

本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗马数字和整数之间的相互转换,首先要懂得什么是罗马数字以及相应的组数规则.LeetCode的题中给出的数字最大的是3999,.针对第一题有两种解法:第一是列举出罗马数字在个十百千上的各种情况,形成一个二维矩阵,然后对整数不停的取余.除10来确定相应的罗马数字:第二种是先列出罗马数字组成情况,然后通过从

LeetCode:二叉树相关应用

LeetCode:二叉树相关应用 基础知识 617.归并两个二叉树 题目 Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new binary tree. The merge ru

用Javascript方式实现LeetCode中的算法(更新中)

前一段时间抽空去参加面试,面试官一开始让我做一道题,他看完之后,让我回答一下这个题的时间复杂度并优化一下,当时的我虽然明白什么是时间复杂度,但不知道是怎么计算的,一开局出师不利,然后没然后了,有一次我逛博客园时看到有个博主的文章说到有LeetCode这玩意,于是就知道了LeetCode.忽然有一种疑问:前端学不学算法?我看过一篇博文:为什么我认为数据结构与算法对前端开发很重要? 我觉得,前端应该是要学一下算法的,不久后前端明朗化,要做的工作量不低于后端人员,到时候也会像优化页面一样去优化js,既

leetcode中第一题twosum问题解答算法的可行性证明

leetcode中第一题twosum问题解答算法的可行性证明 一.引入 关于leetcode中第一题twosum问题,网上已有不少高人做出过解答,并提出了切实可行的算法实现.我在解答该题时参考了博客http://www.zixue7.com/article-9576-1.html的解答.为让读者更直观地阅读和理解本文,先简要摘录以上博客的内容如下: 题目还原 Two Sum Given an array of integers, find two numbers such that they a

C语言中随机数相关问题

用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand(unsigned int seed); //为rand设置"种子"的值 srand()就是给rand()提供种子seed,如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的.通常的做法是以这样一句代码: srand((unsigned)time(NULL)); 来取

补充:sql server 中的相关查询、case函数

相关查询(在同一个表中) 相关查询类似子查询,但是又不同于子查询:子查询中的子条件可以单独查出数据,但是相关查询的子条件不能查处数据.(可以理解成C#中for的穷举法,第一个for走一个,第二个for走一圈,在相关查询中,括号内的数据只有几个,外面的查询有全部的数据,每个数据到括号中去比较是否合适) 格式: select * from 表名1 as a where a.列名 关系表达式或逻辑运算符 ( select * from 表名1 as b where a.相关列名1 = b.相关列名1

leetcode中一些要用到动态规划的题目

需要仔细回顾的题目: 1.Interleaving String   交叉存取字符串 2.Decode Ways   字符串解码 3.Subsets   Subsets II          求一个集合的幂集 leetcode中一些要用到动态规划的题目,布布扣,bubuko.com