C_and_CPP 板


LINE

小弟最近在做八皇后 題目網址: http://www.tcgs.tc.edu.tw/~sagit/luckycat/q167.htm 往上有很多做法 但我看不大懂 所以我就直覺直接用DFS爆搜它 就是用迴圈跑過64個點 每個點都讓它做為第一個皇后的位置 註:action的函式我試過應該沒問題 用途就是一個點放入後 依皇后規則將攻擊範圍全加上1 題目給的兩個測資試過了 可是我傳上去時 出現這行 與正確輸出不相符(line:2) 您的答案為: 636 正確答案為: 663 希望有解過的高手能幫忙看看 =================以下是程式碼================== /*8 queens*/ #include<stdio.h> #include<string.h> #include<deque> using namespace std; deque<int> stack; int use[8][8]={},value[8][8]={},test=40; int get_can_use(int (*map)[8],int x,int y); void action(int (*map)[8],int coordinate,int do_now); int DFS(int x,int y,int queens_amount); int get_value(int (*value_adress)[8],int total); void output(int (*map)[8]){ /*just for test*/ int x,y; for(y=0;y<8;y++){ for(x=0;x<8;x++){ printf("%d ",map[x][y]); } printf("\n"); } printf("\n"); } int main(){ int k,d; while ( ~scanf("%d",&k)){ memset(use,0,sizeof(use)); memset(value,0,sizeof(value)); int i,j,target,u,l,replace; for(;k>0;k--){ int sum=0,total_replace=0; /*save value*/ for(i=0;i<8;i++){ for(j=0;j<8;j++){ scanf("%d",&value[j][i]); } } /*DFS*/ for(u=0;u<8;u++){ for(l=0;l<8;l++){ total_replace=0; action(use,l*10+u,1); stack.push_back(l*10+u); /*set first queen*/ replace=DFS(0,0,1); if(replace==0){ /*start new point*/ memset(use,0,sizeof(use)); continue; } else if(replace==1){ memset(use,0,sizeof(use)); total_replace=get_value(value,total_replace); /*just for test*/ //printf("total_replace=%d\n",total_replace); stack.clear(); /*find max*/ sum=(sum>total_replace)?sum:total_replace; } } } printf("%d\n",sum); } } return 0; } int get_can_use(int (*map)[8],int x,int y){ int target_x,target_y,find=0; target_y=y;target_x=x; for(;target_y<8&&find==0;target_y++){ for(;target_x<8;target_x++){ if(map[target_x][target_y]==0){ find=1; break; } } (find==1)?:target_x=0; if(find==1){ break; } } if(find==1){ x=target_x*10+target_y; /*just for test*/ //printf("----%d\n",x); return x; /*target=x*10+y*/ } else{ /*can't find point*/ return 100; } } void action(int (*map)[8],int coordinate,int do_now){ /*coordinate=x*10+y do_now=1=>put do_now=-1=>remove*/ int start_x,start_y,method,x,y,add_number,left_up=100,left_down=100 ,change,down=0,up=0; start_x=coordinate/10; start_y=coordinate%10; for(x=0;x<8;x++){/*straight walk*/ map[x][start_y]+=do_now; } for(y=0;y<8;y++){/*parallel walk*/ map[start_x][y]+=do_now; } /*find the start point of oblique walk*/ for(change=1;(down==0)||(up==0);change++){ if((((start_x-change)<0)||((start_y-change)<0))&&(up==0)){ left_up=(start_x-change+1)*10+(start_y-change+1); up=1; } if(((start_x-change<0)||(start_y+change>7))&&(down==0)){ left_down=(start_x-change+1)*10+(start_y+change-1); down=1; } } /*將迴圈跳出條件歸0 重複使用*/ up=0;down=0; for(add_number=0;(down==0)||(up==0);add_number++){/*oblique walk*/ if(((left_up/10)+add_number>7)||((left_up%10)+add_number>7)){ up=1; } else if(up==0){ map[(left_up/10)+add_number][(left_up%10)+add_number]+=do_now; } if(((left_down/10)+add_number>7)||((left_down%10)-add_number<0)){ down=1; } else if(down==0){ map[(left_down/10)+add_number][(left_down%10)-add_number]+=do_now; } } map[start_x][start_y]+=(-1)*(do_now*3);/*start repart action 3 times*/ } int DFS(int x,int y,int queens_amount){ int queen,next; if(queens_amount==7){ /*set completely=>break*/ //output(use); return 1; } else { queen=get_can_use(use,x,y); if(queen>=100){ if(stack.size()-1==0){ stack.clear(); if(test>=0){ //output(use); test--; } return 0; } else{ next=stack[stack.size()-1]; /*從失敗的點往後找*/ action(use,stack[stack.size()-1],-1); stack.pop_back(); if(test>=0){ /*just for test*/ //output(use); test--; } if((next/10)+1<=7){ /*往後找一點 不要再用失敗的點*/ return DFS(next/10+1,next%10,stack.size()-1); } else { /*往後找一個時 超過了邊界*/ return DFS(0,next%10+1,stack.size()-1); } } } else{ action(use,queen,1); stack.push_back(queen); if(test>=0){ //output(use); test--; } return DFS(queen/10,queen%10,stack.size()-1); /*find next one*/ } } } int get_value(int (*value_adress)[8],int total){/*get sum from stack*/ /*get value from stack*/ int number; for(number=0;number<8;number++){ total+=value_adress[stack[stack.size()-1]/10][stack[stack.size()-1]%10]; printf("%d ",stack[stack.size()-1]); stack.pop_back(); } printf("\n"); return total; } --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.143.159.1 ※ 編輯: seedpk5079 來自: 220.143.159.1 (06/10 22:35) ※ 編輯: seedpk5079 來自: 220.143.159.1 (06/10 22:42)
1F:推 johnlinvc:一般來說8Queen都是用recursive吧 06/10 23:16
2F:→ netsphere:要不然你也可以放大絕 直接寫八個迴圈 ~ 06/10 23:29
3F:→ sosokill:推樓上 我當初就是放大決XD 06/10 23:30
4F:→ seedpk5079:我這個其實跟放大絕沒啥兩樣 迴圈看起來比較少而已... 06/11 12:38







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP