A
求最小數(Output the minimum)
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
每次給定3個數(均可用int表示),要求找出3個數里的最小的一個,並輸出最小的數。
Input three integers and output the minimum
Input three integers and output the minimum
輸入
a b c 三個數用空格隔開
Input three integers .
Input three integers .
輸出
a b c中最小的一個數
Output the minimum .
Output the minimum .
輸入樣例
5 3 98
輸出樣例
3
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int a,b,c; 5 int ans; 6 int main() 7 { 8 cin>>a>>b>>c; 9 ans=a; 10 if(a>b) ans=b; 11 if(c<ans) ans=c; 12 cout<<ans<<endl; 13 14 return 0; 15 }
B
十進制轉二進制
時限:100ms 內存限制:10000K 總時限:1000ms
描述
將一個10進制的數轉換為二進制數。
輸入
輸入一個10000位以內的十進制數。
輸出
轉換為二進制后輸出。
輸入樣例
1030
輸出樣例
10000000110
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 int n; 8 int main() 9 { 10 int ans[1000],num=0; 11 cin>>n; 12 while(n){ 13 if(n&1) ans[num]=1; 14 else ans[num]=0; 15 n=n>>1; 16 num++; 17 } 18 for(int i=num-1;i>=0;i--){ 19 if(i==num-1) printf("%d",ans[i]); 20 else printf("%d",ans[i]); 21 } 22 cout<<endl; 23 return 0; 24 }
C
迷宮
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
有一個迷宮,迷宮里有一個人,迷宮是規格為N*N的方格,人處於某一位置,可以選擇向上下左右方向前進,但是要保證面對的不是牆壁,否則無法向前行走。
輸入
迷宮的規格,用一個正整數N (2<=N<=20)表示,占一行;輸入一對數據m,n(第m行,第n列),表示人所在的位置坐標,以空格隔開,占一行;輸入要嘗試的前進方向,“w”“s”“a”“d”分別代表上、下、左、右,占一行。
輸出
“Y”
表示可以向該方向前進;最后一行輸出回車
“N”
表示無法向該方向前進;最后一行輸出回車
表示可以向該方向前進;最后一行輸出回車
“N”
表示無法向該方向前進;最后一行輸出回車
輸入樣例
4
0 3
s
0 3
s
輸出樣例
Y
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 int n; 8 int m,t; 9 char str; 10 int main() 11 { 12 cin>>t; 13 cin>>n>>m; 14 cin>>str; 15 if(str=='w'){ 16 if(n==0) printf("N\n"); 17 else printf("Y\n"); 18 } 19 else if(str=='s'){ 20 if(n==t-1) printf("N\n"); 21 else printf("Y\n"); 22 } 23 else if(str=='a'){ 24 if(m==0) printf("N\n"); 25 else printf("Y\n"); 26 } 27 else if(str=='d'){ 28 if(m==t-1) printf("N\n"); 29 else printf("Y\n"); 30 } 31 return 0; 32 }
D
又一個迷宮
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
有一個迷宮,迷宮里有一個人,迷宮是規格為N*N的方格,房內特定位置上有障礙物,人處於某一位置,可以選擇向上下左右方向前進,但是要保證面對的不是牆壁或是障礙物,否則無法向前行走。
輸入
迷宮的規格,一個正整數N (2<=N<=100),占一行,代表矩陣大小;輸入方形矩陣N行N列,由0和1組成,其中0代表空地,1代表障礙物;輸入一對數據m,n(第m行,第n列),表示人所在的位置坐標(保證人所在的位置為“0”,即空地),以空格隔開,占一行;輸入一個整數表示要嘗試的前進方向,0、1、2、3分別代表左、下、右、上。
輸出
“Y”
表示可以向該方向前進
“N”
表示無法向該方向前進
輸出占一行。
表示可以向該方向前進
“N”
表示無法向該方向前進
輸出占一行。
輸入樣例
4
1 0 0 0
1 1 1 0
0 0 1 0
1 0 0 1
0 3
1
1 0 0 0
1 1 1 0
0 0 1 0
1 0 0 1
0 3
1
輸出樣例
Y
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 int n; 8 int m,t; 9 int str; 10 int mat[107][107]; 11 int main() 12 { 13 cin>>t; 14 for(int i=0;i<t;i++) 15 for(int j=0;j<t;j++) 16 { 17 scanf("%d",&mat[i][j]); 18 } 19 cin>>n>>m; 20 cin>>str; 21 if(str==0){ 22 if(m-1>=0&&mat[n][m-1]==0) printf("Y\n"); 23 else printf("N\n"); 24 } 25 else if(str==1){ 26 if(n+1<t&&mat[n+1][m]==0) printf("Y\n"); 27 else printf("N\n"); 28 } 29 else if(str==2){ 30 if(m+1<t&&mat[n][m+1]==0) printf("Y\n"); 31 else printf("N\n"); 32 } 33 else if(str==3){ 34 if(n-1>=0&&mat[n-1][m]==0) printf("Y\n"); 35 else printf("N\n"); 36 } 37 return 0; 38 }
E
字符串替換
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
輸入三個字符串a,b和c,將a中b的第一次出現替換為c。
輸入
輸入三行,每行一個字符串,字符串長度不超過255。
輸出
如果b有出現在a中,輸出替換后的字符串,否則輸出原串a。
輸入樣例
abcdefgh
cde
Xiaolan
cde
Xiaolan
輸出樣例
abXiaolanfgh
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<string> 6 #include<iostream> 7 using namespace std; 8 char a[300],b[300],c[300]; 9 int ff() 10 { 11 int l1=strlen(a),l2=strlen(b); 12 int j=0; 13 for(int i=0;i<l1;i++) 14 { 15 j=0; 16 while(a[i+j]==b[j]){ 17 j++; 18 if(j==l2) return i; 19 } 20 } 21 } 22 int main() 23 { 24 //freopen("in.txt","r",stdin); 25 cin>>a;cin>>b;cin>>c; 26 int point=ff(); 27 int i; 28 for(i=0;i<point;i++) 29 { 30 printf("%c",a[i]); 31 } 32 for(i=0;i<strlen(c);i++) printf("%c",c[i]); 33 for(i=point+strlen(b);i<strlen(a);i++) 34 printf("%c",a[i]); 35 cout<<endl; 36 }
F
六數碼問題
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
現有一兩行三列的表格如下:
A B C
D E F
把1、2、3、4、5、6六個數字分別填入A、B、C、D、E、F格子中,每個格子一個數字且各不相同。每種不同的填法稱為一種布局。如下:
1 3 5
2 4 6
布局1
2 5 6
4 3 1
布局2
定義α變換如下:把A格中的數字放入B格,把B格中的數字放入E格,把E格中的數字放入D格,把D格中的數字放入A格。
定義β變換如下:把B格中的數字放入C格,把C格中的數字放入F格,把F格中的數字放入E格,把E格中的數字放入B格。
問:對於給定的布局,可否通過有限次的α變換和β變換變成下面的目標布局:
1 2 3
4 5 6
A B C
D E F
把1、2、3、4、5、6六個數字分別填入A、B、C、D、E、F格子中,每個格子一個數字且各不相同。每種不同的填法稱為一種布局。如下:
1 3 5
2 4 6
布局1
2 5 6
4 3 1
布局2
定義α變換如下:把A格中的數字放入B格,把B格中的數字放入E格,把E格中的數字放入D格,把D格中的數字放入A格。
定義β變換如下:把B格中的數字放入C格,把C格中的數字放入F格,把F格中的數字放入E格,把E格中的數字放入B格。
問:對於給定的布局,可否通過有限次的α變換和β變換變成下面的目標布局:
1 2 3
4 5 6
輸入
本題有多個測例,第一行為輸入測例的個數n,下面是n行測例,每個測例的輸入是1到6這六個數字的一個排列,空格隔開,表示初始布局ABCDEF格中依次填入的數字。
輸出
每個輸出占一行。輸出轉換到目標格局需要變換的最少次數。(若不能轉換則輸出-1)
輸入樣例
2
2 5 3 1 4 6
2 3 6 1 5 4
2 5 3 1 4 6
2 3 6 1 5 4
輸出樣例
1
2
2
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 struct node 7 { 8 int a[6],num; 9 }; 10 int top,base; 11 node q[10000]; 12 int n,aa[6]; 13 int ans; 14 bool ff; 15 bool flag[666666]; 16 bool judge(int point) 17 { 18 return !flag[point]; 19 } 20 int get_num(int aa[]) 21 { 22 return aa[0]+aa[1]*10+aa[2]*100+aa[3]*1000+aa[4]*10000+aa[5]*100000; 23 } 24 void get1() 25 { 26 aa[1]=q[base].a[0]; 27 aa[4]=q[base].a[1]; 28 aa[3]=q[base].a[4]; 29 aa[0]=q[base].a[3]; 30 aa[2]=q[base].a[2]; 31 aa[5]=q[base].a[5]; 32 } 33 void get2() 34 { 35 aa[0]=q[base].a[0]; 36 aa[3]=q[base].a[3]; 37 aa[1]=q[base].a[4]; 38 aa[2]=q[base].a[1]; 39 aa[5]=q[base].a[2]; 40 aa[4]=q[base].a[5]; 41 } 42 bool can() 43 { 44 for(int i=0;i<6;i++) 45 if(q[base].a[i]!=i+1) return 0; 46 return 1; 47 } 48 void paste(int a1[],int a2[]) 49 { 50 for(int i=0;i<6;i++) a1[i]=a2[i]; 51 } 52 void bfs() 53 { 54 while(base<top){ 55 if(can()){ans=q[base].num;ff=1;return;} 56 get1(); 57 int point=get_num(aa); 58 if(judge(point)){ 59 flag[point]=1; 60 q[top].num=q[base].num+1; 61 paste(q[top++].a,aa); 62 } 63 get2(); 64 point=get_num(aa); 65 if(judge(point)){ 66 flag[point]=1; 67 q[top].num=q[base].num+1; 68 paste(q[top++].a,aa); 69 } 70 base++; 71 } 72 } 73 int main() 74 { 75 node n1; 76 scanf("%d",&n); 77 while(n--){ 78 for(int i=0;i<6;i++) scanf("%d",&q[0].a[i]); 79 ff=0; 80 top=base=0;q[0].num=0;top=1; 81 memset(flag,0,sizeof(flag)); 82 int point=get_num(q[0].a); 84 flag[point]=1; 85 bfs(); 86 if(!ff) printf("-1\n"); 87 else printf("%d\n",ans); 88 } 89 return 0; 90 }
G
1422.輸出命題公式的真值表
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
先輸入一個正整數n(n小於等於10),表示共有n個命題變元,再輸入一個類似於逆波蘭表達式的字符串表示一個命題公式,約定在該字符串中用一位的十進制數表示一個命題變元,用a、o、n、i、e分別表示且、或、非、蘊含、等值,用類似於逆波蘭表達式形式的字符串表示的命題公式的真值表波蘭表達式(即二元運算,兩個操作數在前,運算符在后;一元運算,一個操作數在前,運算符在后)。
輸入
先輸入一個小於等於10的正整數n,再輸入一個字符串。
輸出
輸出該字符串表示的命題公式的真值表。
提示:
如果用P、Q、R分別表示這三個命題變元的話,
輸入數據01a2i表示的命題公式是:((P∧Q)→R)
輸入數據012ia表示的命題公式是:(P∧(Q→R))
輸入數據0n表示的命題公式是:┐P
提示:
如果用P、Q、R分別表示這三個命題變元的話,
輸入數據01a2i表示的命題公式是:((P∧Q)→R)
輸入數據012ia表示的命題公式是:(P∧(Q→R))
輸入數據0n表示的命題公式是:┐P
輸入樣例
3
01a2i
01a2i
輸出樣例
0 0 0 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 1
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stack> 6 using namespace std; 7 stack<int> s; 8 int n,l; 9 char str[100]; 10 int ans[20]; 11 void slove() 12 { 13 int top=1; 14 while(!s.empty()) s.pop(); 15 char s1,s2,n1,n2; 16 for(int i=0;i<l;i++) 17 { 18 if(str[i]=='a') 19 { 20 s2=s.top();s.pop(); 21 s1=s.top();s.pop(); 22 if(s1=='0'||s2=='0') s.push('0'); 23 else s.push('1'); 24 } 25 else if(str[i]=='o') 26 { 27 s2=s.top();s.pop(); 28 s1=s.top();s.pop(); 29 if(s1=='0'&&s2=='0') s.push('0'); 30 else s.push('1'); 31 } 32 else if(str[i]=='i') 33 { 34 s2=s.top();s.pop(); 35 s1=s.top();s.pop(); 36 if(s1=='1'&&s2=='0') s.push('0'); 37 else s.push('1'); 38 } 39 else if(str[i]=='e') 40 { 41 s2=s.top();s.pop(); 42 s1=s.top();s.pop(); 43 if(s1==s2) s.push('1'); 44 else s.push('0'); 45 } 46 else if(str[i]=='n') 47 { 48 s1=s.top();s.pop(); 49 if(s1=='0') s.push('1'); 50 else s.push('0'); 51 } 52 else{ 53 char c=ans[top++]+'0'; 54 s.push(c); 55 } 56 } 57 } 58 void print() 59 { 60 for(int i=1;i<=n;i++) 61 printf("%d ",ans[i]); 62 printf("%c\n",s.top()); 63 } 64 void dfs(int point) 65 { 66 if(point>n) {slove();print();return;} 67 for(int i=0;i<2;i++) 68 { 69 ans[point]=i; 70 dfs(point+1); 71 } 72 } 73 74 int main() 75 { 76 scanf("%d",&n); 77 scanf("%s",str); 78 l=strlen(str); 79 dfs(1); 80 return 0; 81 }
H
計算單詞的個數
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
給以行句子,寫一個程序判斷它有幾個單詞。
輸入
輸入占一行,行尾有空格,並且只含有大寫字母和小寫字母和空格。
輸出
單詞的個數。
例如:
printf("%d\n"),num;
例如:
printf("%d\n"),num;
輸入樣例
General game players are systems able to
輸出樣例
7
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<string> 6 #include<iostream> 7 using namespace std; 8 char a[10007]; 9 int main() 10 { 11 //freopen("in.txt","r",stdin); 12 int ans=0; 13 cin.getline(a,10002); 14 int l=strlen(a); 15 for(int i=0;i<l;i++) 16 if(a[i]==' '&&i>0&&a[i-1]!=' ') ans++; 17 cout<<ans<<endl; 18 }
I
連陰雨
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
因為連續的降雨,我們學校操場上出現了許多水坑,現在需要統計一共有多少個水坑。
題目輸入為一個N譓 (1 <= N <= 100; 1 <= M <= 100)的圖,('W') 代表積水,('.')代表干燥。一處積水我們認為和它周圍的八個方向相鄰,相鄰的積水構成一個水坑。
需要輸出一個數字,表示一共有多少個互不相鄰的水坑。
題目輸入為一個N譓 (1 <= N <= 100; 1 <= M <= 100)的圖,('W') 代表積水,('.')代表干燥。一處積水我們認為和它周圍的八個方向相鄰,相鄰的積水構成一個水坑。
需要輸出一個數字,表示一共有多少個互不相鄰的水坑。
輸入
第一行:兩個正整數n和m。
第二行到第n+1行:輸入操場信息,每一點的狀態只可能是'W' 或者'.'。
第二行到第n+1行:輸入操場信息,每一點的狀態只可能是'W' 或者'.'。
輸出
輸出一個正整數,表示不相鄰的水坑的數目。
輸入樣例
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
輸出樣例
3
//這題西工大的測試數據好像出錯了,poj上有這個的原題
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 int n,m; 7 char mat[1007][1007]; 8 int q[1000007]; 9 int next[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1}; 10 bool flag[1007][1007]; 11 bool t; 12 bool can(int i,int j) 13 { 14 if(i>=0&&i<n&&j>=0&&j<m&&!flag[i][j]&&mat[i][j]!='.') return 1; 15 return 0; 16 } 17 void bfs(int point) 18 { 19 int top=0,base=0,l,r,ll,rr; 20 q[top++]=point; 21 while(base<top){ 22 l=q[base]/m;r=q[base]%m; 23 for(int i=0;i<8;i++) 24 { 25 ll=l+next[i][0];rr=r+next[i][1]; 26 if(can(ll,rr)){ 27 t=1; 28 flag[ll][rr]=1; 29 q[top++]=ll*m+rr; 30 } 31 } 32 base++; 33 } 34 } 35 int main() 36 { 37 while(~scanf("%d%d",&n,&m)){ 38 int i,j;char c; 39 t=0; 40 for(int i=0;i<n;i++) 41 { 42 c=getchar(); 43 for(int j=0;j<m;j++) 44 { 45 46 c=getchar(); 47 mat[i][j]=c; 48 49 } 50 } 51 memset(flag,0,sizeof(flag)); 52 long long ans=0; 53 for(i=0;i<n;i++) 54 for(j=0;j<m;j++) 55 { 56 if(!flag[i][j]&&mat[i][j]!='.') 57 { 58 t=0; 59 flag[i][j]=1; 60 ans++; 61 bfs(i*m+j); 62 } 63 } 64 cout<<ans<<endl;} 65 return 0; 66 }
