POJ 2965做题笔记 #DFS# #枚举#
2017-01-23 15:43
288 查看
POJ2965
今天做了POJ的第二题,题目和昨天写的1753差不多,主要区别是2965要求写出操作的步骤,我想的是用一个长度为16的数组来保存每次操作,每次操作由一个二位数来保存,十位为行数row,个位为列数column,返回上一层时清空该位数组中的数,如果判定完成要求时操作步骤小于上一种情况,则将其另外保存起来。
我很快就写完了,提交之后发现WA,我赶紧找了几组其他的数据来检验,结果发现并没有什么问题,我以为是输出的格式问题,在WA无数次后我发现如果输入
输出全是1。
于是我发现了问题所在;我在对数组初始化时写的是:
这种初始化的方法只能把数组都初始化为0:
所以应该采用循环赋值或者memset函数;
函数介绍
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法[1] 。
注意:
- 长度是以字节为单位,如本题中用法是
- memset函数对数组而言只能用于置零(0)或置负一(-1)操作。
- 该函数只能取ch的后八位(二进制)赋值给你所输入的范围的每个字节。
memset_百度百科
b211
最后写程序的时候还有一个小问题,就是要实现数组的复制的时候,不能直接
小结:写程序的时候还是好多小问题,希望自己坚持下来。
今天做了POJ的第二题,题目和昨天写的1753差不多,主要区别是2965要求写出操作的步骤,我想的是用一个长度为16的数组来保存每次操作,每次操作由一个二位数来保存,十位为行数row,个位为列数column,返回上一层时清空该位数组中的数,如果判定完成要求时操作步骤小于上一种情况,则将其另外保存起来。
我很快就写完了,提交之后发现WA,我赶紧找了几组其他的数据来检验,结果发现并没有什么问题,我以为是输出的格式问题,在WA无数次后我发现如果输入
++++ +--- +--- +---
输出全是1。
于是我发现了问题所在;我在对数组初始化时写的是:
c[16]={-1};这样吧c[0]=-1,其余的赋值为0。
这种初始化的方法只能把数组都初始化为0:
c[16]={0};这样才是正确的。
所以应该采用循环赋值或者memset函数;
函数介绍
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法[1] 。
注意:
- 长度是以字节为单位,如本题中用法是
memset(c,-1,4*16);
- memset函数对数组而言只能用于置零(0)或置负一(-1)操作。
- 该函数只能取ch的后八位(二进制)赋值给你所输入的范围的每个字节。
memset_百度百科
b211
最后写程序的时候还有一个小问题,就是要实现数组的复制的时候,不能直接
c[16]=b[16];,应该采用循环赋值。
#include<iostream> using namespace std; void opposite(int b[4][4], int row, int column) //单个反向 { if (row <0 || column <0 || row > 3 || column > 3) return; if (b[row][column] == 0) b[row][column] = 1; else b[row][column] = 0; } void flip(int b[4][4], int row, int column) //反向操作 { opposite(b, row, column); for (int x = 0; x < 4; x++) opposite(b, row, x); for (int x = 0; x < 4; x++) opposite(b, x,column); } bool isover(int b[4][4]) //判断是否符合要求 { for (int x = 0; x < 4; x++) for (int y = 0; y < 4; y++) if (b[x][y]==0) return false; return true; } void select(int b[4][4], int c[16],int d[16],int n, int deep, int row, int column,int *q) { for (; row < 4; row++) for (; column < 4; column++) { flip(b, row, column); c = 10 * (row +1) + column+1; if (isover(b) && *q > 17 - deep) { *q = 17 - deep; for (int x = 0; x < 16; x++) d[x] = c[x]; } if (column == 3 && row != 3) select(b, c, d, n + 1, deep - 1, row + 1, 0,q); else select(b, c,d,n+1,deep - 1, row, column + 1,q); flip(b, row, column); //复原为之前的状态 c = -1; if (column == 3) { column = 0; break; } } } int main() { char a; int b[4][4] = { 0 }, *q,p=20; q = &p; for (int x = 0; x < 4; x++) { for (int y = 0; y < 4; y++) { cin >> a; if (a == '+') b[x][y] = 0; else b[x][y] = 1; } } //0代表+close,1代表-open,b[]为转化后的数组 cout << endl; int c[16] ; int d[16] ; memset(c, -1, 16 * 4); memset(d, -1, 16 * 4); select(b, c,d,0,16, 0, 0,q); cout <<p << endl; int y; for (y = 0; y < 15; y++) { if (d[y+1] == -1) break; cout << d[y]/10<<' '<<d[y]%10<< endl; } cout << d[y] / 10 << ' ' << d[y] % 10 ; return 0; }
小结:写程序的时候还是好多小问题,希望自己坚持下来。
相关文章推荐
- [POJ1149]PIGS 做题笔记
- [POJ]1811Prime Test 做题笔记
- POJ做题笔记:1000,1004,1003
- [POJ1001]狼抓兔子 做题笔记
- [POJ1087]A Plug for UNIX 做题笔记
- POJ 2109做题笔记#贪心#
- [POJ1325]机器调度 做题笔记
- 【占坑】POJ 1328做题笔记 #贪心#
- poj 1753||poj 2965 枚举+dfs
- POJ 2965 The Pilots Brothers' refrigerator
- hdu ACM Steps 做题笔记(Chapter Two)(Section 1)
- http://poj.org/problem?id=2965
- POJ2965
- ProjectEuler做题笔记(第1,2题)
- 编程之美--做题笔记(1)
- poj 2965 The Pilots Brothers' refrigerator
- poj 2965 The Pilots Brothers' refrigerator--棋盘--深搜
- POJ 2965 The Pilots Brothers' refrigerator BFS+位运算
- POJ 1988 第一次在POJ上做题,5次AC
- poj 1062 做题要细心。。。。。。dijkstra + 枚举