hdu4403暴力搜索
生活随笔
收集整理的這篇文章主要介紹了
hdu4403暴力搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你一個數字串,讓你在里面添加一個=和若干個+,使等式成立.
思路:
? ? ?給你一個數字串,讓你在里面添加一個=和若干個+,使等式成立.
思路:
? ? ?lmax最大是15,直接暴搜,無壓力,關鍵是判重,要在答案的時候判重,一開始在進隊列之前判的,各種wa,哎!后來才發現如果在之前判斷就不能得到當前什么符號都不加,而下一個有符號了,判重我用的是map,隨意什么只要別爆內存就行,水搜索竟然調了2個小時,丟臉啊...
#include<stdio.h> #include<string.h> #include<queue> #include<map> using namespace std;typedef struct {int mk[16];char str[16];int nowid ,deng; }NODE;NODE xin ,tou; int nn; map<__int64 ,__int64>mark;bool MK(NODE aa) {__int64 sum = 0;for(int i = 0 ;i <= nn ;i ++)sum = sum * 10 + aa.mk[i];if(mark[sum]) return 1;mark[sum] = 1;return 0; }bool ok(NODE tou) {if(tou.deng){int l ,r;l = r = 0;int sum = 0;int mki;for(int i = 0 ;tou.mk[i] != 2 ;i ++){if(tou.mk[i] == 1){l += sum;sum = tou.str[i] - 48;}else{sum = sum * 10 + tou.str[i] - 48;}mki = i;}l += sum;sum = 0;for(int i = mki + 1;i <= nn ;i ++){if(tou.mk[i] == 1){r += sum;sum = tou.str[i] - 48;}else{sum = sum * 10 + tou.str[i] - 48;}}r += sum;return l == r && !MK(tou); }return 0; }int BFS() {memset(xin.mk ,0 ,sizeof(xin.mk));nn = strlen(xin.str) - 1;xin.nowid = 0;xin.deng = 0;queue<NODE>q;q.push(xin);int ans = 0;mark.clear();while(!q.empty()){tou = q.front();q.pop();if(ok(tou))ans ++;if(tou.nowid == nn) continue; if(!tou.deng)// = {xin = tou;xin.deng = 1;xin.nowid = tou.nowid + 1;xin.mk[xin.nowid] = 2;q.push(xin); }//+ xin = tou;xin.deng = tou.deng;xin.nowid = tou.nowid + 1;xin.mk[xin.nowid] = 1;q.push(xin);// xin = tou;xin.deng = tou.deng;xin.nowid = tou.nowid + 1;xin.mk[xin.nowid] = 0;q.push(xin);} return ans; }int main () {while(~scanf("%s" ,xin.str) && strcmp("END" ,xin.str)){printf("%d\n" ,BFS());}return 0; }
總結
以上是生活随笔為你收集整理的hdu4403暴力搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4400 BFS+STL
- 下一篇: hdu4494