日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

24点(伪题解)

發(fā)布時間:2023/12/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 24点(伪题解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?題目傳送門:https://www.luogu.org/problemnew/show/P1236

這個題dalao都是用后綴表達式做的,而我這種蒟蒻什么都不會只能強行爆搜失敗。思路簡單:假設輸入的四個數為6 6 6 6,那么我們可以看出答案可以為6+6+6+6=24或6*6-6-6=24,那么無論如何式子都是由三個運算符號和四個數字組成的,那么在dfs(i)中我們根據i的奇偶來判斷枚舉的是什么(奇數位數字,偶數位運算符最后i==8時判斷)。注意點:題目中要求+或*時兩數若有大小先輸大小(頭腦發(fā)昏的我開始-和/都交換了位置),不要忘記了1 3 5 7,這種由兩部分分別運算最后合起來的式子(3-1=2,7+5=12,12*2=24)。

那么最后來解釋一下為什么說是偽題解,以下程序它本身非常神奇地無法處理輸入的四個數中有重復的數且無解的情況(貌似是棧溢出了但我弄了兩個小時也沒弄好),直到我火了,我開始用一個sum1判斷這個輸入有無重復的數,再用sum規(guī)定在有重復的數(即sum1=1)有一個搜索底線(不太好用深度或廣度來形容),簡單的說,就是讓它在棧溢出的邊緣瘋狂試探,搜索時不再死循環(huán)。以下為代碼(這個300多行的代碼令人神魂顛倒盡管很多是復制的):

#include<stdio.h> #include<stdlib.h> int a[100]={0},step1[100]={0},step2[100]={0},vis[1000]={0}; int flag=0,sum=0,sum1=0; int judge1() {int i,ans;ans=0;for(i=1;i<=3;i++)if(step2[i]==1){if(i==1)ans=step1[i]+step1[i+1];else ans+=step1[i+1];}else if(step2[i]==2){if(i==1)ans=step1[i]-step1[i+1];else ans-=step1[i+1];}else if(step2[i]==3){if(i==1)ans=step1[i]*step1[i+1];else ans*=step1[i+1];}else if(step2[i]==4){if(step1[i]%step1[i+1]!=0) return 0;if(i==1)ans=step1[i]/step1[i+1];else ans/=step1[i+1];}if(ans==24)return 1;return 0; } int judge2() {int i,j,ans1=0,ans2=0;if(step2[1]==1){ans1=step1[1]+step1[2];}else if(step2[1]==2){ans1=step1[1]-step1[2];}else if(step2[1]==3){ans1=step1[1]*step1[2];}else if(step2[1]==4){if(step1[1]%step1[2]!=0) return 0;ans1=step1[1]/step1[2];}if(step2[3]==1){ans2=step1[3]+step1[4];}else if(step2[3]==2){ans2=step1[3]-step1[4];}else if(step2[3]==3){ans2=step1[3]*step1[4];}else if(step2[3]==4){if(step1[3]%step1[4]!=0) return 0;ans2=step1[3]/step1[4];}if(step2[2]==1)ans1=ans1+ans2;else if(step2[2]==2)ans1=ans1-ans2;else if(step2[2]==3)ans1=ans1*ans2;else if(step2[2]==4){if(ans1%ans2!=0)return 0;ans1=ans1/ans2;}if(ans1==24) return 1;return 0; } int write1() {int i,j,ans=0,tmp;if(step2[1]==1){ans=step1[1]+step1[2];if(step1[1]>step1[2])printf("%d+%d=%d\n",step1[1],step1[2],ans);else printf("%d+%d=%d\n",step1[2],step1[1],ans);}else if(step2[1]==2){ans=step1[1]-step1[2];if(step1[1]>step1[2])printf("%d-%d=%d\n",step1[1],step1[2],ans);else printf("%d-%d=%d\n",step1[2],step1[1],ans);}else if(step2[1]==3){ans=step1[1]*step1[2];if(step1[1]>step1[2])printf("%d*%d=%d\n",step1[1],step1[2],ans);else printf("%d*%d=%d\n",step1[2],step1[1],ans);}else if(step2[1]==4){ans=step1[1]/step1[2];if(step1[1]>step1[2])printf("%d/%d=%d\n",step1[1],step1[2],ans);else printf("%d/%d=%d\n",step1[2],step1[1],ans);}for(i=2;i<=3;i++)if(step2[i]==1){tmp=ans;ans+=step1[i+1];if(tmp>step1[i+1])printf("%d+%d=%d\n",tmp,step1[i+1],ans);else printf("%d+%d=%d\n",step1[i+1],tmp,ans);}else if(step2[i]==2){tmp=ans;ans-=step1[i+1];printf("%d-%d=%d\n",tmp,step1[i+1],ans);}else if(step2[i]==3){tmp=ans;ans*=step1[i+1];if(tmp>step1[i+1])printf("%d*%d=%d\n",tmp,step1[i+1],ans);else printf("%d*%d=%d\n",step1[i+1],tmp,ans);}else if(step2[i]==4){tmp=ans;ans/=step1[i+1];printf("%d/%d=%d\n",tmp,step1[i+1],ans);}return 0; } int write2() {int i,ans1=0,ans2=0;if(step2[1]==1){ans1=step1[1]+step1[2];if(step1[1]>step1[2])printf("%d+%d=%d\n",step1[1],step1[2],ans1);else printf("%d+%d=%d\n",step1[2],step1[1],ans1);}else if(step2[1]==2){ans1=step1[1]-step1[2];if(step1[1]>step1[2])printf("%d-%d=%d\n",step1[1],step1[2],ans1);else printf("%d-%d=%d\n",step1[2],step1[1],ans1);}else if(step2[1]==3){ans1=step1[1]*step1[2];if(step1[1]>step1[2])printf("%d*%d=%d\n",step1[1],step1[2],ans1);else printf("%d*%d=%d\n",step1[2],step1[1],ans1);}else if(step2[1]==4){ans1=step1[1]/step1[2];printf("%d/%d=%d\n",step1[1],step1[2],ans1);}if(step2[3]==1){ans2=step1[3]+step1[4];if(step1[3]>step1[4])printf("%d+%d=%d\n",step1[3],step1[4],ans2);else printf("%d+%d=%d\n",step1[4],step1[3],ans2);}else if(step2[3]==2){ans2=step1[3]-step1[4];printf("%d-%d=%d\n",step1[3],step1[4],ans2);}else if(step2[3]==3){ans2=step1[3]*step1[4];if(step1[3]>step1[4])printf("%d*%d=%d\n",step1[3],step1[4],ans2);else printf("%d*%d=%d\n",step1[4],step1[3],ans2);}else if(step2[3]==4){ans2=step1[3]/step1[4];printf("%d/%d=%d\n",step1[3],step1[4],ans2);}if(step2[2]==1){if(ans1>ans2)printf("%d+%d=24\n",ans1,ans2);else printf("%d+%d=24\n",ans2,ans1);}else if(step2[2]==2){if(ans1>ans2)printf("%d-%d=24\n",ans1,ans2);else printf("%d-%d=24\n",ans2,ans1);}else if(step2[2]==3){if(ans1>ans2)printf("%d*%d=24\n",ans1,ans2);else printf("%d*%d=24\n",ans2,ans1);}else if(step2[2]==4){if(ans1>ans2)printf("%d/%d=24\n",ans1,ans2);else printf("%d/%d=24\n",ans2,ans1);}return 0; } int dfs(int i) {int j;sum++;if(i==8){if(judge1()==1){flag=1;write1();}return 0;}if(flag==1)return 0;if(sum>3700&&sum1==1) return 0;if(sum>5000) return 0;if(i%2==1){for(j=1;j<=4;j++)if(vis[j]==0){step1[i/2+1]=a[j];vis[j]=1;dfs(i+1);if(sum>3700&&sum1==1) return 0;if(sum>5000) return 0;step1[i/2+1]=0;vis[j]=0;}}else{for(j=1;j<=4;j++){step2[i/2]=j;dfs(i+1);if(sum>3700&&sum1==1) return 0;if(sum>5000) return 0;step2[i/2]=0;}}return 0; } int dfs2(int i) {int j;sum++;if(i==8){if(judge2()==1){flag=1;write2();}return 0;}if(flag==1)return 0;if(sum>3700&&sum1==1) return 0;if(sum>5000) return 0;if(i%2==1){for(j=1;j<=4;j++)if(vis[j]==0){step1[i/2+1]=a[j];vis[j]=1;dfs2(i+1);if(sum>3700&&sum1==1) return 0;if(sum>5000) return 0;step1[i/2+1]=0;vis[j]=0;}}else{for(j=1;j<=4;j++){step2[i/2]=j;dfs2(i+1);if(sum>3700&&sum1==1) return 0;if(sum>5000) return 0;step2[i/2]=0;}}return 0; } int main() {int n,i;for(i=1;i<=4;i++){scanf("%d",&a[i]);if(vis[a[i]]==0)vis[a[i]]=1;else sum1=1;}memset(vis,0,sizeof(vis));dfs(1);if(flag==0){sum=0;dfs2(1);if(flag==0)printf("No answer!");}return 0; }

?

總結

以上是生活随笔為你收集整理的24点(伪题解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。