usaco window arear(递归求矩形覆盖面积)
生活随笔
收集整理的這篇文章主要介紹了
usaco window arear(递归求矩形覆盖面积)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這種算法挺厲害的。
畫圖很容易理解但是正確性很難證明。
學習了,。
這是到學校的第一份代碼。
新的一學期又開始了。
/*
ID;jinbo wu
TASK:window
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
struct node
{int x0,y0,x,y;int num;
}w[77];
int k;
double ans;
int m;
void solve(int i,int x0,int y0,int x,int y)
{if(x0>=x||y0>=y)return ;for(;i<=75;i++)if(w[i].x0&&w[i].num>w[k].num) break;if(i==76){m+=(y-y0)*(x-x0);return ;}solve(i+1,x0,y0,min(x,w[i].x0),y);solve(i+1,max(x0,w[i].x),y0,x,y);solve(i+1,max(x0,w[i].x0),max(y0,w[i].y),min(x,w[i].x),y);solve(i+1,max(x0,w[i].x0),y0,min(x,w[i].x),min(y,w[i].y0));return ;
}
int main()
{freopen("window.in","r",stdin);freopen("window.out","w",stdout);char a,b,c;int minn=0;int maxn=0;while(~scanf("%c",&c)){if(c=='w'){scanf("%c%c",&a,&b);if(b>='0'&&b<='9')k=b-'0'+55;else if(b>='a'&&b<='z')k=b-'a'+28;elsek=b-'A';scanf(",%d,%d,%d,%d",&w[k].x0,&w[k].y0,&w[k].x,&w[k].y);w[k].num=++maxn;if(w[k].x0>w[k].x)swap(w[k].x0,w[k].x);if(w[k].y0>w[k].y)swap(w[k].y0,w[k].y);}if(c=='b'){scanf("%c%c",&a,&b);if(b>='0'&&b<='9')k=b-'0'+55;else if(b>='a'&&b<='z')k=b-'a'+28;elsek=b-'A';w[k].num=--minn;}if(c=='t'){scanf("%c%c",&a,&b);if(b>='0'&&b<='9')k=b-'0'+55;else if(b>='a'&&b<='z')k=b-'a'+28;elsek=b-'A';w[k].num=++maxn; }if(c=='d'){scanf("%c%c",&a,&b);if(b>='0'&&b<='9')k=b-'0'+55;else if(b>='a'&&b<='z')k=b-'a'+28;elsek=b-'A';w[k].x0=0;}if(c=='s'){m=0;scanf("%c%c",&a,&b);if(b>='0'&&b<='9')k=b-'0'+55;else if(b>='a'&&b<='z')k=b-'a'+28;elsek=b-'A';ans=(w[k].x-w[k].x0)*(w[k].y-w[k].y0);solve(0,w[k].x0,w[k].y0,w[k].x,w[k].y);ans=m/ans*100;printf("%.3f\n",ans);}}
}
總結
以上是生活随笔為你收集整理的usaco window arear(递归求矩形覆盖面积)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卵巢早衰导致不孕
- 下一篇: 奥拉星烈阳利刃可以进阶成金装吗