充分的用到题目的五条法则:
过的了测试数据应该就能过了!!
#include<stdio.h> #include<vector> #include<string.h> #include<algorithm> using namespace std; vector<int>v; vector<int>::iterator it; int main() { int T,N,i,j,k,x; int st,ed; int a[32][32]; char s[5]; int dis; while(scanf("%d",&T)!=EOF&&T!=0) { v.clear(); memset(a,0,sizeof(a)); dis=0;//车的路程 for(i=0;i<T;i++) for(j=0;j<T;j++) scanf("%d",&a[i][j]); scanf("%d",&N); st=0;//起始点 for(i=0;i<N;i++) { scanf("%s",s); if(s[0]=='U') { scanf("%d",&x); if(x!=st)v.push_back(x);//记录乘客目的地,不载现在的地点 } else if(v.size()==6||(s[0]=='G'&&v.size()>0)) { ed=v.front();//记录终点 //it=v.begin(); //for(;it!=v.end();it++){ } // printf("%d ",*it);//printf("\n%d\n",ed), //if(*it==ed)v.erase(it);//数组减小,删除 //v.erase(remove(v.begin(),v.end(),it),v.end()); v.erase(remove(v.begin(), v.end(),ed), v.end()); // 真的删除所有 //printf("\t@@%d %d %d**",st,ed,a[st][ed]); dis+=a[st][ed]; //printf("%d %d\n",a[st][ed],dis); st=ed;//一趟完成,记录新的起点 } } printf("%d\n",dis); } return 0; }
那些打斜杠的地方就是 调试的艰辛啊!!!!!!!!!!!!
主要还是STL用的不好!!!!!!!!!!!!!!!!!!!
s.erase(it)删除由迭代器it 所指向的元素。
● 在循环内做某些事情(除了删除对象之外):如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase时记得都用它的返回值更新你的迭代器。
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
{
if(*
it == 8)
it
= arr.erase(it);
else
++it;
}
/*
for(vector<int>::iterator
it=arr.begin(); it!=arr.end(); it ++)
{
if(*
it == 8)
{
arr.erase(it);
//在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。
}
}
*/
v.erase(remove(v.begin(), v.end(), 99), v.end());包含在<algorithm>中 // 真的删除所有99