关于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;
}

2. Count and Say

The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.

好吧,其实这道题我提交了几遍发现结果都不对,主要是没有搞清楚input,感觉leetcode上面的题目,对于题意还是要给出明确

的定义。这里的input n表示第n个数的意思,初始的string是"1",所以如果n=1,那么直接输出“1”,如果n=2的时候,那么就要对“1”

进行一个count_and_say也就是"11",等等。

哎,刚开始的时候还以为输入的是一个整形n,然后对n中的这个整形做count_and_say,所以不断的去取每一位的值,然后做int to char的

转换。好吧,题意明确以后,实现还是很简单的。

/******************count and say*********************/
//很简单就是一道字符串操作的题目
//By Lingtao in 2015/4/23
string count(string str_n)
{
	int count = 1;
	string result;
	char last = str_n[0];
	for (int i = 1; i < str_n.length();i++)
	{
		if (last == str_n[i])
			count++;
		else
		{
			result += '0' + count;
			result += last;
			last = str_n[i];
			count = 1;
		}
	}
	result += '0' + count;
	result += last;
	return result;
}
string countAndSay(int n) {
	if (n < 0)
		return NULL;
	string say = "1";
	for (int i = 1; i < n; i++)
	{
		say = count(say);
	}
	return say;
}
未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值