한 노 타 (비 귀속)

11084 단어 알고리즘
알고리즘:
탑 자리 a, b, c 가 삼각형 으로 배열 되 어 있다 고 가정 하면 a - > b - > c - > a 는 시계 방향 순환 을 구성한다.원반 을 이동 하 는 과정 에서 홀수 로 이동 하면 가장 작은 원반 을 시계 방향 으로 다음 탑 자리 로 이동 시 킵 니 다. 짝수 로 이동 하면 최소 원반 이 움 직 이지 않 고 다른 두 탑 자리 사이 에 작은 원반 을 다른 탑 자리 로 이동 시 킵 니 다. 그러나 이런 알고리즘 의 목적 탑 자 리 는 확실 하지 않 습 니 다. 원반 수량 n 이 홀수 일 때.목적 탑 자 리 는 b 이 고 짝수 는 c 이 므 로 n 의 짝수 에 따라 조금 바 꿔 야 한다.
#include 
#include 
#include 
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
const int maxn = 100+5;
int n;
stack<int> a[3];//  3    
char s[3] = {'a', 'b', 'c'};

//   x       --->y  
bool mov(int x, int y){
	if(a[x].empty()) return false;
	if(!a[y].empty()&&a[x].top() > a[y].top()) return false;
	a[y].push(a[x].top());
	a[x].pop();
	printf("%c -> %c
"
, s[x], s[y]); return true; } int main() { int cnt; while(scanf("%d",&n) == 1&&n){ for(int i = n-1; i >= 0; --i) a[0].push(i); if(n%2 == 1) swap(s[1], s[2]); cnt = 0; while(++cnt){ mov((cnt-1)%3, cnt%3); if(!mov((cnt-1)%3, (cnt+1)%3)&&!mov((cnt+1)%3, (cnt-1)%3)) break; } } fclose(stdin); return 0; }

좋은 웹페이지 즐겨찾기