王道機試 搜尋

2021-09-26 05:01:34 字數 4554 閱讀 2829

case1:百雞問題,

三重迴圈的,在判斷/3時,因為是取整是去尾的,我用了(z+2)/3,這樣就不會因為去尾造成問題了

#includeusing namespace std;

int main()

} return 0;

}

其實可以優化為二重迴圈(王道上 迴圈變數x和y的範圍分別是100和100-x,這樣z就一定是》=0的了,我寫的還需要判斷z>=10,容易出錯)

#includeusing namespace std;

int main()

} return 0;

}

case2:找出所有滿足abc+bcc=532的abc。

#includeusing namespace std;

int main()

} return 0;

}

網上還看到一種方案,是按 每位來的

#includeint main() 

}} }

return 0;

}

case3:old bill,金錢5位數,只能看到中間3位,給出買了的火雞數,問想要最貴的雞對應的首尾數字以及雞的單價

#includeusing namespace std;

int main()

}} if(!ok) printf("0\n");

} return 0;

}

注意的點:

case1:勝利大逃亡。板子題,記好咯。注意這裡在maze是int,若是char可能會出現讀入空格或換行,可以在%c前面加上空格解決該問題

#include#include#includeusing namespace std;

const int n=51;

int maze[n][n][n];//0是路,1是牆

int vis[n][n][n];

int a,b,c,ti;//a*b*c的maze,ti是限定時間

struct node s,v; //不過是兩個結構體變數, 後面經常會用到,沒有特別含義,

//若說有,那就是s更像temp,v用來表示next node(其實就是乙個s表示不下了而已

queueq;

int go[6][3]= ; //6個方向

int bfs()

} return -1;//bfs完了都沒return,說明沒出去

}int main() s,v;

queueq;

int vis[n][n][n];

int v,x,y;//體積,兩杯子容量

void a2b(int &a, int va, int &b, int vb)

else

}int check(int a,int b,int c)

int bfs()

a=s.a;

b=s.b;

c=s.c;

a2b(b,x,a,v);//b->a

if(!vis[a][b][c])

a=s.a;

b=s.b;

c=s.c;

a2b(a,v,c,y);//a->c

if(!vis[a][b][c])

a=s.a;

b=s.b;

c=s.c;

a2b(c,y,a,v);//c->a

if(!vis[a][b][c])

a=s.a;

b=s.b;

c=s.c;

a2b(b,x,c,y);//b->c

if(!vis[a][b][c])

a=s.a;

b=s.b;

c=s.c;

a2b(c,y,b,x);//c->b

if(!vis[a][b][c])

} return 0;

}int main()

} return 0;

}

case3:acute stroke,就是簡單的求「體積」,也就是聯通塊,但是犯了兩個非常經典的錯誤,小結一下:

#include#include#includeusing namespace std;

int a[62][1288][130];

int vis[62][1288][130];

int m,n,l,t;

struct node s,v;

queueq;

int go[6][3]= ;

int bfs(int x,int y,int z)

} }if(ans>=t) return ans;

else return 0;

}int main()

int main()

return 0;

}

case2:素數環問題 就是環內任意兩個數的sum必須是素數。這裡有些技巧

#include#includeusing namespace std;

const int n=17;//因為我是1~16,所以是17!

int prime= ; //15+16=31,最多到31就夠了

int n;

int ans[n];

int vis[n];

int check(int x)

return 0;

}void dfs(int num)

for(int i=2;i<=n;i++) }}

int main()

return 0;

}

case3:oil deposit,判斷聯通塊個數。dfs/bfs都可以,dfs**精簡,速度也不見得慢多少,比較沒有也回溯,一條路dfs到頭就行了,這裡dfs的功能就是把同乙個聯通塊都標記上,注意:

#include#includeusing namespace std;

const int n=101;

char maze[n][n];

int vis[n][n];

int m,n;

int go[8][2]= ;//8方向

int dfs(int x,int y) }}

int main() while(next_permutation(a.begin(),a.begin()+n));//不能到a.end() 但是用cin的話是可以的

printf("\n");//或者用puts("") 會自動加上換行

} return 0;

}

我自己基於dfs也寫了乙個像next_permutation那種,得到比原本「大」的排列,方法是用乙個變數控制後面的排列是否可以「隨便排」,比如原序列是213,排第一位的時候,必須是》=2才能排,如果排了2,第二位還是不能隨便排,必須是》=1,但是若第一位排了3,後面的就可以隨便排了。但是我沒實現「去重」,即111的排列結果會是6個111

#include#include#includeusing namespace std;

string s,ans;

int vis[26];

int n;

int dfs(int x, int is)

else if(s[i]==s[x])

} else if(is==1)

} }}int main()

return 0;

}

case5:tempter of the bone 要判斷是否可以在規定的時間點從s點到d點。又一起比較了dfs與bfs,這是存在性問題,適合dfs,且不能用bfs,因為bfs是在按照「最短路」走,這題完全不是這個意思,就是需要彎彎繞然後在規定時間到達終點。有乙個非常棒的剪枝操作:

#include#include#includeusing namespace std;

const int n=10;

char maze[n][n];

int vis[n][n];

int m,n,t,ans;

int sx,sy,dx,dy;//開始位置和門的位置

int go[4][2]= ;

void dfs(int x,int y,int step) else if(step>t || ans)

return ;

for(int i=0; i<4; i++) }}

int main()

else if(maze[i][j]=='d')

}//華麗的prune:奇偶性同,但t為奇數,不行;反之也不行

// if((sx+sy)&1==(dx+dy)&1 && t&1==1 || (sx+sy)&1!=(dx+dy)&1 && t&1==0)

else

} return 0;

}

王道機試 日期類問題

題目描述 有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天輸入 有多組資料,每組資料有兩行,分別表示兩個日期,形式為yyyymmdd輸出 每組資料輸出一行,即日期差值做題思路 樣例輸入 20110412 20110422樣例輸出 11對於日期類 年月日,就像學生資訊...

菜鳥的機試準備 王道機試指南 演算法筆記

字串雜湊 100000582 b 100000582 c 100000582 d 今天第幾天?清華 include include using namespace std int month tab 2 13 bool is leapyear int year intmain else 上邊的if ...

王道機試指南NO 4Day Of Week

時間限制 1s 記憶體限制 32mb輸入乙個日期,要求輸出該日期為星期幾 9 october 2001 14 october 2001 tuesday sunday 1 日期類問題,先預處理出每個日期與原點日期 0年1月1日 之間的天數間隔,存入buf三維陣列。2 看到題目考慮兩個問題 今天星期幾?...