TheBlocksProblem(嘻嘻其实难到我想哭,太费脑子了)-创新互联
- The Blocks Problem
题目题意:初始时从左到右有 n个木块,编号为 0.... n − 1 0....n−1 0....n−1,要求实现下列四种操作:
move a onto b : 把 a 和 b上方的木块归位,然后把 a 放到 b 上面。
move a over b : 把 a 上方的木块归位,然后把 a 放在 b 所在木块堆的最上方。
pile a onto b : 把 b 上方的木块归位,然后把 a 及以上的木块坨到 b 上面。
pile a over b : 把 a 及以上的木块坨到 b 的上面。
归位就是放回原来的位置
一组数据的结束标志为 quit,如果有非法指令(如 a 与 b 在同一堆),无需处理。
输出:所有操作输入完毕后,从左到右,从下到上输出每个位置的木块编号。
- 每个木块堆高度不定,可以使用C++STL里的不定长数组vector。
- n个木块代表n个vector,n不超过25,所以vector大小也不超过25。
#include
#includeusing namespace std;
#includevectorblock[30];
int n;
//初始化
void init()
{cin >>n;
for (int i = 0; i< n; i++)
{block[i].push_back(i);//一开始木块的位置都是在原位
}
}
//输出下标和高度
void location(int x,int &p,int &h)
{for (int i = 0; i< x; i++)
{for (int j = 0; j< block[i].size(); j++)
{ p = i;//在第几个木堆
h = j;//所在的这个木堆有多高
}
}
}
//归位
void goback(int p,int h)//p位>h之上全部归位
{for (int i = h + 1; i< block[p].size(); i++)
{int k = block[p][i];//
block[k].push_back(k);
}
block[p].resize(h + 1);//重置大小 0-h
}
//移动
void move(int ap, int ah, int bp)
{for (int i = ah ; iint k = block[ap][i];
block[bp].push_back(k);
}
block[ap].resize(ah);
}
void solve()
{int a, b;
string s1, s2;
while (cin >>s1)
{if (s1 == "quit")
{ break;//退出while语句
}
else
{ cin >>a >>s2 >>b;
int ap = 0, ah = 0, bp = 0, bh = 0;//p是堆号,h是高度
location(a, ap, ah);
location(b, bp, bh);
if (ap == bp)
{ continue;
}
if (s1 == "move")//a归位
{ goback(ap, ah);
}
if (s2 == "onto")
{ goback(bp, bh);
}
move(ap, ah, bp);
}
}
}
void print()
{for (int i = 0;icout<< i<< ":";
for (int j = 0; j< block[i].size(); j++)
{ cout<< block[i][j]<< " ";
}
cout<< endl;
}
}
int main()
{init();
solve();
print();
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
专注于为中小企业提供成都网站建设、成都网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业内丘免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了超过千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。网站名称:TheBlocksProblem(嘻嘻其实难到我想哭,太费脑子了)-创新互联
文章分享:http://azwzsj.com/article/dgoddh.html