poj 1208 模拟而已

毛线的dp

如果要和dp扯上边的话就是 找出每次移动的共同点 不用写四个函数 只用写两个函数,dp不就是用空间换时间的思想么。。。现在空间换了手敲代码的时间。。。。呵呵。。。。

题目理解了好半天

然后WA了半天。。。。mapping那里搞错了

操操操

好蛋疼的模拟,不是题目蛋疼,是自己蛋疼。。。。操操操

AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;

int mapping[25];
int s[25][100];
int num[25];
int N;

void initial(){
	for( int i = 0; i < N; i++ ){
		mapping[i] = i;
		s[i][0] = i;
		num[i] = 1;
	}
}

void move_back( int pos, int a ){
	int temp = 0;
	while( s[pos][temp++] != a ){
	}
	for( int i = temp; i < num[pos]; i++ ){
		mapping[s[pos][i]] = s[pos][i];
		num[s[pos][i]] = 1;
	}
	num[pos] = temp;
}

void moves( int posa, int val, int posb ){
	int temp = 0;
	while( s[posa][temp++] != val ){
	}
	temp--;
	for( int i = temp; i < num[posa]; i++ ){
		mapping[s[posa][i]] = mapping[posb];
		s[posb][num[posb]++] = s[posa][i];
	}
	num[posa] = temp;
}

int main(){
	
	while( scanf( "%d", &N ) != EOF ){
		
		initial();
		
		char temp1[10], temp2[10];
		int temp3, temp4;
		while( scanf( "%s", temp1 ) && strcmp( temp1, "quit" ) ){
			scanf( "%d%s%d", &temp3, temp2, &temp4 );
			if( mapping[temp3] == mapping[temp4] ){
				continue;
			}
			if( strcmp( temp1, "move" ) == 0 ){
				if( strcmp( temp2, "onto" ) == 0 ){
					move_back( mapping[temp3], temp3 );
					move_back( mapping[temp4], temp4 );
				}else{
					move_back( mapping[temp3], temp3 );
				}
				num[mapping[temp3]]--;
				mapping[temp3] = mapping[temp4];
				s[mapping[temp4]][num[mapping[temp4]]++] = temp3;
			}else{
				if( strcmp( temp2, "onto" ) == 0 ){
					move_back( mapping[temp4], temp4 );
					moves( mapping[temp3], temp3, mapping[temp4] );
				}else{
					moves( mapping[temp3], temp3, mapping[temp4] );
				}
			}
		}

		for( int i = 0; i < N; i++ ){
			cout << i << ":";
			for( int j = 0; j < num[i]; j++ ){
				cout << " " << s[i][j];
			}
			cout << endl;
		}
	}

	return 0;
}

测试数据生成代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double random()
{
    return (double) rand() / RAND_MAX;
}
int rando(int m)
{
    return (int)(random() * (m-1) + 0.5);
}
int main()
{
    int n, i, m, ci;
    freopen("in.txt", "w", stdout);
    srand(time(NULL));
    scanf("%d", &n);
    for (i=0; i<n; i++)
    {
        m = rand()%50+1;
        printf("%d/n", m);
        ci = 10;
        while (ci--)
        {
            if (rand()%2 ==0)
            {
                printf("move");
            }
            else
            {
                printf("pile");
            }
            printf(" ");
            printf("%d",rando(m));
            printf(" ");
            if (rand()%2 ==0)
            {
                printf("onto");
            }
            else
            {
                printf("over");
            }
            printf(" ");
            printf("%d ",rando(m));
           // printf("/n");
        }
        printf("quit                              ");
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值