今天作了四道題,可是這裏只放三道,最後一道題我不會,第一題和第二題有錯誤。ios
題目描述:小王同窗在座標系的(0,0)處,可是他找不到考試的試場,因而一邊走路一邊問路, 每一個被問路的人會告訴他一個指令(包括走路或轉彎),如今請編一個程序,顯示他每次走 路後的座標(轉彎後坐標不變,因此沒必要顯示座標)。 初始方向向 y 軸正半軸!!數組
一開始以爲這道題很簡單嘛,實際上這題的確很簡單,直接放代碼把:函數
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long n,a=0,b=0,q=0,hhh=0; int dx[5]={0,1,0,-1};//這是用來在須要走相應步數時對應的方向 int dy[5]={1,0,-1,0}; string s; int main(){ scanf("%lld",&n); for(int i=0;i<n;i++){ cin>>s; if(s[0]>='0'&&s[0]<='9'){ long long hh=0; for(int i=0;i<s.length();i++){//若是輸入的是數字而不是指令那麼久用一個變量把這個數字存起來 hh*=10; hh+=s[i]-'0'; } a+=hh*dx[q];//x和y都按照指令行走相應的步數 b+=hh*dy[q]; printf("(%lld,%lld)\n",a,b);//每次行走都要輸出 hhh=1;//原本我也忘了,若是隻是轉了方向而沒有走路的話,那麼座標就是(0,0),我一開始沒有讓他輸出,不過這不是什麼大問題,用一個標記數組標記一下最後判斷就行了,因此我就直接加上了。 } else{//若是這不是數字而是指令 if(s=="left"){//那麼判斷是這兩種裏面的哪種指令,若是是left就讓變量q--(這是爲了讓他走路的時候走正確的方向) if(q>0) q--; else q=4;q--; } if(s=="right"){//若是是right就讓變量q++ if(q<3) q++; else q=0; } } } if(hhh==0) printf("(0,0)\n");//若是沒有走路的話就輸出(0,0) return 0; }
可是我犯了一個致命錯誤:spa
由於若是else後面不加大括號只能執行一條語句(這個我也是纔剛剛知道,否則也不可能錯了)code
因此咱們把p=4;p--;這兩條語句改爲p=3;這一條就AC了。blog
題目描述:在一個大試場裏,有 n 行 m 列的考生,小王和衆多同窗正在考試,這時,有一部分考生 做弊,固然,監考老師能發現他們。可是隻有一個監考老師,他因爲高度近視,只能發現與 他同行同列的做弊者,並且因爲監考老師年老體弱,在考試過程當中沒法移動。如今已知 n*m 個考生中誰在做弊,請幫監考老師找一個位置,能夠發現最多的做弊者(監考老師能夠和某 個考生在同一位置)。若是監考老師的位置上的考生在做弊,那麼監考老師先先後看,發現 他做弊,再左右看,又發現他做弊,算作發現 2 個考生做弊。ci
這題同樣,我也是手殘了,原本很簡單,只要遍歷一遍每次判斷就能夠了:string
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,a[1010][1010],maxx=0; int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&a[i][j]); } }//以上爲輸入 for(int i=0;i<n;i++){//遍歷一遍數組 for(int j=0;j<m;j++){ int hh=0;//每次都定義一個用來計數的變量hh for(int k=0;k<n;k++){//先遍歷這一個老師所在的點的一行中有多少個做弊的 if(a[k][j]==1) hh++; } for(int k=0;k<n;k++){//先遍歷這一個老師所在的點的一列中有多少個做弊的 if(a[i][k]==1) hh++; } maxx=max(maxx,hh);//最後比較大小,保存更大的 }//由於咱們用了兩個for循環分別遍歷了老師所在的行和列,而老師所在的點呢,就被判斷了兩次,因此咱們也不用能夠去根據題目要求判斷什麼的了 } printf("%d\n",maxx);//輸出 return 0; }
可是你們必定能發現一個致命的問題:io
由於這個for跟上面那個for很像嘛,因此我就直接複製過來了,可是我沒有改掉k<n,致使我直接就WA了。
for循環
把k<n改成k<m就AC了。
題目描述:小王在考試中遇到一道難題:方程 a1+a2+„„+an=m 的非負整數解有幾個,請你幫他算 一下(這也能夠算做他做弊吧)。
深搜就好,我直接放代碼了:
#include<iostream> #include<cstdio> using namespace std; int n,m,ans=0,a[1010][1010]; void dfs(int idx,int hh){ if(idx==n){//若是到達了一個目標 if(hh==0) ans++;//若是到達了最終目標,就讓總個數加加 return;//返回上一層 } for(int i=0;i<=m;i++){ if((hh-i)>=0&&idx+1<=n){//這個判斷不加也不要緊,不過加了能夠省很多步驟 dfs(idx+1,hh-i);//調用dfs函數進行深搜 } } return; } int main(){ scanf("%d%d",&n,&m); dfs(0,m);//調用深搜函數 printf("%d\n",ans); return 0; }