
acm poj1208 不知道哪错了,总是wrong answer
#include<iostream>#include<cstdio>usingnamespacestd;intn,a,b;structBlock{intnum;intno...
#include<iostream>
#include<cstdio>
using namespace std;
int n,a,b;
struct Block
{
int num;
int no;
Block *next;
}block[30],head[30],*qian[30];
void clear(int p)
{
Block *pre,*now;
now=block[p].next;
pre=&block[p];
while(now!=NULL)
{
pre->next=NULL;
head[now->no].next=now;
pre=now;
now=now->next;
}
}
void m(int a,int b)
{
qian[a]->next=NULL;
Block *point=&block[b];
while(point->next!=NULL)
{
point=point->next;
}
point->next=&block[a];
qian[a]=point;
while(point->next!=NULL)
{
point=point->next;
point->num=block[b].num;
}
}
void moveonto()
{
clear(a);
clear(b);
m(a,b);
}
void moveover()
{
clear(a);
m(a,b);
}
void pileonto()
{
clear(b);
m(a,b);
}
void pileover()
{
m(a,b);
}
int main()
{
int i;
char c1[5],c2[5];
scanf("%d",&n);
for(i=0;i<n;i++)
{
head[i].next=&block[i];
block[i].num=i; //block所在序列
block[i].no=i; //block编号
block[i].next=NULL;
qian[i]=&head[i];
}
while(scanf("%s",&c1))
{
if(!strcmp(c1,"quit")) break;
scanf("%d %s %d",&a,&c2,&b);
if(a==b) continue;
if(block[a].num==block[b].num) continue;
if(!strcmp(c1,"move"))
{
if(!strcmp(c2,"onto")) moveonto();
else moveover();
}
else
{
if(!strcmp(c2,"onto")) pileonto();
else pileover();
}
//cout<<c1[0]<<' '<<c2[1]<<endl;
}
for(i=0;i<n;i++)
{
cout<<i<<": ";
Block *p=&head[i];
while(p->next!=NULL)
{
p=p->next;
cout<<p->no<<' ';
}
cout<<endl;
}
return 0;
} 展开
#include<cstdio>
using namespace std;
int n,a,b;
struct Block
{
int num;
int no;
Block *next;
}block[30],head[30],*qian[30];
void clear(int p)
{
Block *pre,*now;
now=block[p].next;
pre=&block[p];
while(now!=NULL)
{
pre->next=NULL;
head[now->no].next=now;
pre=now;
now=now->next;
}
}
void m(int a,int b)
{
qian[a]->next=NULL;
Block *point=&block[b];
while(point->next!=NULL)
{
point=point->next;
}
point->next=&block[a];
qian[a]=point;
while(point->next!=NULL)
{
point=point->next;
point->num=block[b].num;
}
}
void moveonto()
{
clear(a);
clear(b);
m(a,b);
}
void moveover()
{
clear(a);
m(a,b);
}
void pileonto()
{
clear(b);
m(a,b);
}
void pileover()
{
m(a,b);
}
int main()
{
int i;
char c1[5],c2[5];
scanf("%d",&n);
for(i=0;i<n;i++)
{
head[i].next=&block[i];
block[i].num=i; //block所在序列
block[i].no=i; //block编号
block[i].next=NULL;
qian[i]=&head[i];
}
while(scanf("%s",&c1))
{
if(!strcmp(c1,"quit")) break;
scanf("%d %s %d",&a,&c2,&b);
if(a==b) continue;
if(block[a].num==block[b].num) continue;
if(!strcmp(c1,"move"))
{
if(!strcmp(c2,"onto")) moveonto();
else moveover();
}
else
{
if(!strcmp(c2,"onto")) pileonto();
else pileover();
}
//cout<<c1[0]<<' '<<c2[1]<<endl;
}
for(i=0;i<n;i++)
{
cout<<i<<": ";
Block *p=&head[i];
while(p->next!=NULL)
{
p=p->next;
cout<<p->no<<' ';
}
cout<<endl;
}
return 0;
} 展开
展开全部
不知道
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
题意:
对搬积木的四种方式的理解。
1、move a onto b
在将a搬到b上之前,先将a和b上的积木放回原来的位置(例如:1就放回1的最开始位罝)
2、move a over b
在将a搬到b所在的那堆积木上前,先将a上的积木放回原来的位罝(b所在的那堆不动)
3、pile a onto b
将a本身和其上的积木一起放到b上,在搬之前b上方的积木放回原位
4、pile a over b
将a本身和其上的积木一起搬到到b所在的那堆上
5、quit
结束命令,前四个动作中若a=b,或者a, b在同一堆中,该动作不合法,不做改变。
思路:模拟
学习点:
读懂题是关键,接着就是模拟。
源代码:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
const int MAXN = 26;
stack <int> nBlock[MAXN];
int nNum;
int nIndex[MAXN]; //ÓÃÓÚÈ·¶¨ÊÇ·ñÔÚͬһ¶ÑÉÏ¡£
void funcInit();
void funcInput();
void funcOutput();
void procMove(int nFlag, int nFrom, int nTo);
void procReturn(int n);
void procMoveF3F4(int nFrom, int nTo);
int main()
{
cin >> nNum;
funcInit();
funcInput();
funcOutput();
return 0;
}
void funcInit()
{
for (int i = 0; i != nNum; ++i)
{
nBlock[i].push(i);
nIndex[i] = i;
}
}
void funcInput()
{
int nFlag;
int nFrom, nTo;
string nStr1, nStr2;
while (cin >> nStr1, nStr1 != "quit")
{
cin >> nFrom >> nStr2 >> nTo;
if (nFrom == nTo || nIndex[nFrom] == nIndex[nTo]) continue;
if (nStr1 == "move" && nStr2 == "onto") nFlag = 1;
else if (nStr1 == "move" && nStr2 == "over") nFlag = 2;
else if (nStr1 == "pile" && nStr2 == "over") nFlag = 3;
else nFlag = 4;
procMove(nFlag, nFrom, nTo);
}
}
void funcOutput()
{
stack <int> tmp;
for (int i = 0; i != nNum; ++i)
{
cout << i << ':';
if (nBlock[i].empty())
{
cout << endl;
continue;
}
while (!nBlock[i].empty())
{
tmp.push(nBlock[i].top());
nBlock[i].pop();
}
while (!tmp.empty())
{
cout << ' ' << tmp.top();
tmp.pop();
}
cout << endl;
}
}
void procMove(int nFlag, int nFrom, int nTo)
{
if (nFlag == 1) // move onto
{
procReturn(nFrom);
procReturn(nTo);
nBlock[nIndex[nFrom]].pop();
nBlock[nIndex[nTo]].push(nFrom);
nIndex[nFrom] = nIndex[nTo];
}
else if (nFlag == 2) // move over
{
procReturn(nFrom);
nBlock[nIndex[nFrom]].pop();
nBlock[nIndex[nTo]].push(nFrom);
nIndex[nFrom] = nIndex[nTo];
}
else if (nFlag == 3) // pile over
{
procMoveF3F4(nFrom, nTo);
}
else
{
procReturn(nTo);
procMoveF3F4(nFrom, nTo);
}
}
void procReturn(int n)
{
int num = nIndex[n];
while (nBlock[num].top() != n)
{
int tmp = nBlock[num].top();
nBlock[num].pop();
nBlock[tmp].push(tmp);
nIndex[tmp] = tmp;
}
}
void procMoveF3F4(int nFrom, int nTo)
{
stack <int> tmp;
int nF = nIndex[nFrom], nT = nIndex[nTo];
while (nBlock[nF].top() != nFrom)
{
tmp.push(nBlock[nF].top());
nBlock[nF].pop();
}
tmp.push(nBlock[nF].top());
nBlock[nF].pop();
while (!tmp.empty())
{
int topNum = tmp.top();
nBlock[nT].push(topNum);
nIndex[topNum] = nT;
tmp.pop();
}
}
对搬积木的四种方式的理解。
1、move a onto b
在将a搬到b上之前,先将a和b上的积木放回原来的位置(例如:1就放回1的最开始位罝)
2、move a over b
在将a搬到b所在的那堆积木上前,先将a上的积木放回原来的位罝(b所在的那堆不动)
3、pile a onto b
将a本身和其上的积木一起放到b上,在搬之前b上方的积木放回原位
4、pile a over b
将a本身和其上的积木一起搬到到b所在的那堆上
5、quit
结束命令,前四个动作中若a=b,或者a, b在同一堆中,该动作不合法,不做改变。
思路:模拟
学习点:
读懂题是关键,接着就是模拟。
源代码:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
const int MAXN = 26;
stack <int> nBlock[MAXN];
int nNum;
int nIndex[MAXN]; //ÓÃÓÚÈ·¶¨ÊÇ·ñÔÚͬһ¶ÑÉÏ¡£
void funcInit();
void funcInput();
void funcOutput();
void procMove(int nFlag, int nFrom, int nTo);
void procReturn(int n);
void procMoveF3F4(int nFrom, int nTo);
int main()
{
cin >> nNum;
funcInit();
funcInput();
funcOutput();
return 0;
}
void funcInit()
{
for (int i = 0; i != nNum; ++i)
{
nBlock[i].push(i);
nIndex[i] = i;
}
}
void funcInput()
{
int nFlag;
int nFrom, nTo;
string nStr1, nStr2;
while (cin >> nStr1, nStr1 != "quit")
{
cin >> nFrom >> nStr2 >> nTo;
if (nFrom == nTo || nIndex[nFrom] == nIndex[nTo]) continue;
if (nStr1 == "move" && nStr2 == "onto") nFlag = 1;
else if (nStr1 == "move" && nStr2 == "over") nFlag = 2;
else if (nStr1 == "pile" && nStr2 == "over") nFlag = 3;
else nFlag = 4;
procMove(nFlag, nFrom, nTo);
}
}
void funcOutput()
{
stack <int> tmp;
for (int i = 0; i != nNum; ++i)
{
cout << i << ':';
if (nBlock[i].empty())
{
cout << endl;
continue;
}
while (!nBlock[i].empty())
{
tmp.push(nBlock[i].top());
nBlock[i].pop();
}
while (!tmp.empty())
{
cout << ' ' << tmp.top();
tmp.pop();
}
cout << endl;
}
}
void procMove(int nFlag, int nFrom, int nTo)
{
if (nFlag == 1) // move onto
{
procReturn(nFrom);
procReturn(nTo);
nBlock[nIndex[nFrom]].pop();
nBlock[nIndex[nTo]].push(nFrom);
nIndex[nFrom] = nIndex[nTo];
}
else if (nFlag == 2) // move over
{
procReturn(nFrom);
nBlock[nIndex[nFrom]].pop();
nBlock[nIndex[nTo]].push(nFrom);
nIndex[nFrom] = nIndex[nTo];
}
else if (nFlag == 3) // pile over
{
procMoveF3F4(nFrom, nTo);
}
else
{
procReturn(nTo);
procMoveF3F4(nFrom, nTo);
}
}
void procReturn(int n)
{
int num = nIndex[n];
while (nBlock[num].top() != n)
{
int tmp = nBlock[num].top();
nBlock[num].pop();
nBlock[tmp].push(tmp);
nIndex[tmp] = tmp;
}
}
void procMoveF3F4(int nFrom, int nTo)
{
stack <int> tmp;
int nF = nIndex[nFrom], nT = nIndex[nTo];
while (nBlock[nF].top() != nFrom)
{
tmp.push(nBlock[nF].top());
nBlock[nF].pop();
}
tmp.push(nBlock[nF].top());
nBlock[nF].pop();
while (!tmp.empty())
{
int topNum = tmp.top();
nBlock[nT].push(topNum);
nIndex[topNum] = nT;
tmp.pop();
}
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询