殘缺棋盤遊戲
阿新 • • 發佈:2022-05-21
分支演算法
題意描述:
在2^k * 2^k的正方形棋盤上有一個缺口,這裡可以認為是已經被填充了,要求給出使用三角板去填滿這個棋盤的方案
#include <iostream> using namespace std; int amount,Board[100][100]; void Cover(int tr,int tc,int dr,int dc,int size) { int s,t; if(size<2) return ; amount++; t=amount; s=size/2; if(dr<tr+s&&dc<tc+s)//殘缺在左上角 { //覆蓋中間位置 Board[tr+s-1][tc+s]=t; Board[tr+s][tc+s-1]=t; Board[tr+s][tc+s]=t; Cover(tr,tc,dr,dc,s);//覆蓋左上 Cover(tr,tc+s,tr+s-1,tc+s,s);//覆蓋右上 Cover(tr+s,tc,tr+s,tc+s-1,s);//覆蓋左下 Cover(tr+s,tc+s,tr+s,tc+s,s);//覆蓋右下 } else if(dr<tr+s&&dc>=tc+s)//殘缺在右上角 { Board[tr+s-1][tc+s-1]=t; Board[tr+s][tc+s-1]=t; Board[tr+s][tc+s]=t; Cover(tr,tc,tr+s-1,tc+s-1,s); Cover(tr,tc+s,dr,dc,s); Cover(tr+s,tc,tr+s,tc+s-1,s); Cover(tr+s,tc+s,tr+s,tc+s,s); } else if(dr>=tr+s&&dc<tc+s)//殘缺在左下 { Board[tr+s-1][tc+s-1]=t; Board[tr+s-1][tc+s]=t; Board[tr+s][tc+s]=t; Cover(tr,tc,tr+s-1,tc+s-1,s); Cover(tr,tc+s,tr+s-1,tc+s,s); Cover(tr+s,tc,dr,dc,s); Cover(tr+s,tc+s,tr+s,tc+s,s); } else { Board[tr+s-1][tc+s-1]=t; Board[tr+s-1][tc+s]=t; Board[tr+s][tc+s-1]=t; Cover(tr,tc,tr+s-1,tc+s-1,s); Cover(tr,tc+s,tr+s-1,tc+s,s); Cover(tr+s,tc,tr+s,tc+s-1,s); Cover(tr+s,tc+s,dr,dc,s); } } void Print(int s) { for(int i=1;i<=s;i++) { for(int j=1;j<=s;j++) printf("%5d ",Board[i][j]); printf("\n"); } } int main() { int s=1,k,x,y; printf("輸入2殘缺棋盤的規模:2^k,k="); scanf("%d",&k); for(int i=1;i<=k;i++) s*=2; printf("輸入棋盤殘缺位置(x,y):"); scanf("%d%d",&x,&y); Board[x][y]=0; Cover(1,1,x,y,s); Print(s); return 0; }