硬币问题
题目描述:
有N个硬币(6<=N<=20000)全部正面朝上排成一排,每次将其中5个硬币翻过来放在原位置,直到最后全部硬币翻成反面朝上为止。试编程找出步数最少的翻法,输出最少步数及翻法。
*分析:本题的关键是找出从当前状态如何变化到下一状态(即变化的规律)。 *
任意翻转5个硬币,正反面的个数变化为:
- 5正0反 正-5 反+5
- 4正1反 正-3 反+3
- 3正2反 正-1 反+1
- 2正3反 正+1 反-1
- 1正4反 正+3 反-3
- 0 正5反 正+5 反-5
即有6种变化,用state[i]表示节点i正面的个数,完成翻转即正面的个数为0,在执行上面6种翻转时要检查是否符合翻条件,即正面的个数和反面的个数要大于其对应的翻转数,生成新节点时要判断此节点是否出现过,否则就会出现相同的5个硬币翻来翻去的情况。
code:
nbnbnb
#include<iostream>
using namespace std;
struct a{
int x,y,ans,t;
}b[1000010];
int m,n,x,y