毛线的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;
}