單純測試哪種效率高,ios::sync_with_stdio(0); cin.tie(0);-->3ms,360kb,ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); -->2ms,364kb,scanf printf -->(2ms, 344KB)。總結下來scanf printf的IO效率高,這題因為輸出量大ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);,效率第二。
解題思路: ios::sync_with_stdio(0); cin.tie(0);可增加輸入輸出效率,開始位置在(m-1,0)。為了程式乾淨,另外寫一個函式,將方位寫清楚,要仔細檢查,避免沒寫好,以及邊界要設定。使用set裝走過的字母,好處是不會重複,所以直接s.size()就能輸出包含幾種字母。以下提供C++原始碼:
#include<bits/stdc++.h>
using namespace std;
int m,n,k,i,j,b[101],f,g;
char a[21][21];
set<int>s;
void p(int c,int d,int e)
{
if(e==0)
{
if(c-1>=0)
c--;
}
else if(e==1)
{
if(d+1<n)
d++;
}
else if(e==2)
{
if(d+1<n&&c+1<m)
{
c++;
d++;
}
}
else if(e==3)
{
if(c+1<m)
c++;
}
else if(e==4)
{
if(d-1>=0)
d--;
}
else
{
if(d-1>=0&&c-1>=0)
{
c--;
d--;
}
}
s.insert(a[c][d]);
printf("%c",a[c][d]);
f=c;
g=d;
}
int main()
{
scanf("%d%d%d",&m,&n,&k);
for(i=0;i<m;i++)
scanf("%s",&a[i]);
for(i=0;i<k;i++)
scanf("%d",&b[i]);
f=m-1;
g=0;
for(i=0;i<k;i++)
p(f,g,b[i]);
printf("\n%d\n",s.size());
return 0;
}