您的位置:首页 > 其它

POJ 2965做题笔记 #DFS# #枚举#

2017-01-23 15:43 288 查看
POJ2965

今天做了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;
}


小结:写程序的时候还是好多小问题,希望自己坚持下来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: