因?yàn)榭床欢畇tl的東西 所以為了熟悉語(yǔ)法 就模仿(chaoxi)書上的思路 熟悉了一遍語(yǔ)法 但是令人尷尬的是 即使是抄 我也抄錯(cuò)了...好在是為了熟悉語(yǔ)法 能不能跑無(wú)所謂(嗯袖肥。卧土。缠局。)
例題:
http://acm.hust.edu.cn/vjudge/contest/128220#problem/B
輸入n,得到編號(hào)為0n-1的木塊差凹,分別擺放在順序排列編號(hào)為0n-1的位置。現(xiàn)對(duì)這些木塊進(jìn)行操作,操作分為四種曙强。
1福稳、move a onto b:把木塊a涎拉、b上的木塊放回各自的原位,再把a(bǔ)放到b上的圆;
2鼓拧、move a over b:把a(bǔ)上的木塊放回各自的原位,再把a(bǔ)發(fā)到含b的堆上越妈;
3季俩、pile a onto b:把b上的木塊放回各自的原位,再把a(bǔ)連同a上的木塊移到b上梅掠;
4酌住、pile a over b:把a(bǔ)連同a上木塊移到含b的堆上。
當(dāng)輸入quit時(shí)瓤檐,結(jié)束操作并輸出0~n-1的位置上的木塊情況
抄的過(guò)程中 也發(fā)現(xiàn)了不少問(wèn)題
1 vector<int>pile[maxn]; 類似于創(chuàng)建了一個(gè)確定行數(shù) 不確定列數(shù)的二維數(shù)組 而且每一列可不同和
2 vector<int> a;
for(int i=0;i<10;i++)
a[i]=i;
//這種做法以及類似的做法都是錯(cuò)誤的 下標(biāo)只能用于獲取已存在的元素赂韵,而現(xiàn)在的a[i]還是空的對(duì)象
3 也許是處于空間的考慮 每一次做完一個(gè)部分 便把vector的空間壓縮到剛剛好大//不不不這里理解錯(cuò)了 是移動(dòng)完把原來(lái)刪除了
4 不要讓main里過(guò)于冗長(zhǎng) 用函數(shù)替代那些重復(fù)的部分
5 vector之間互為“一等公民”
6 int& p 作為參數(shù)傳入函數(shù)類似于指針
7 關(guān)于本題
(1) 有許多重復(fù)性操作 用函數(shù) 且onto操作先于move
(2) pa == pb 為非法指令(與其他操作矛盾或者說(shuō)是多余無(wú)用的操作)
(3) 思路:
先進(jìn)行輸入 再找a,b的位置 再以ab的位置為基礎(chǔ) 進(jìn)行移動(dòng) 最后輸出即可
以下是源代碼
#include<vector>
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int n;
const int maxn = 30;
vector<int>pile[maxn];
void found(int ch,int & p,int& h);//找位置
void back_(int p,int h);//放回
void pile_over(int p,int h,int p2);//最后的移動(dòng)
int main(){
int a,b;
string s1,s2;
cin>>n;//輸入有幾堆
for(int i = 0; i < n; i++)//在第i堆輸入i【0】【0】 【1】【0】 【2】【0】...【n-1】【0】
pile[i].push_back(i);
while(cin>>s1>>a>>s2>>b){
int pa,pb,ha,hb;
found(a,pa,ha);
found(b,pb,hb);
if(pa == pb) continue;
if(s2 == "onto") back_(pb,hb);
if(s1 == "move") back_(pa,ha);
pile_over(pa,pb,ha);
}
for(int i = 0; i < n ; i++){
printf("%d: ", i);
for(int j = 0; j < pile[i].size(); i++){
printf("%d ", pile[i][j]);
}
printf("\n");
}
return 0;
}
void found(int ch,int &p,int &h){
for(p = 0; p < n; p++)
for(h = 0; h < pile[p].size(); h++)
if(pile[p][h] == ch) return;
}
void back_(int p,int h){//也可以倒著挠蛉,先將最后一個(gè)移回祭示,再刪除該堆最后一個(gè)元素
for(int i = h+1 ; i < pile[p].size(); i++){
int b = pile[p][i];
pile[b].push_back(b);//如果該堆沒(méi)有該元素,那么該堆一定沒(méi)有元素
}
pile[p].resize(h+1);
}
void pile_over(int p,int h,int p2){
for(int i = h ; i < pile[p].size(); i++)
pile[p2].push_back(pile[p][i]);
pile[p].resize(h);
}
第一次復(fù)習(xí):思路還是在的,先找出所輸入木塊的位置质涛,再將重復(fù)性操作按一定的順序?qū)懖懗龊瘮?shù) 最后輸出
但是 再具體實(shí)現(xiàn)的時(shí)候還是一籌莫展
1 如何找到標(biāo)記稠歉? 遍歷數(shù)組找到x 并用.size()計(jì)算出y即高度
2 類似指針的方式傳入變量
3 順序?onto==move>pile
4 如何移動(dòng)汇陆? 木塊的序號(hào)和所在位置相同 用找到的位置下標(biāo)賦值回各容器 然后直接改變?nèi)萜鞔笮?取消那些被移動(dòng)的位置