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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

CSP认证201604-2俄罗斯方块[C++题解]:模拟、枚举

發布時間:2025/4/5 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSP认证201604-2俄罗斯方块[C++题解]:模拟、枚举 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目分析


來源:acwing

分析:

對了,剛開始的時候沒看懂16 ~ 19行是啥意思?后來才知道,樣例中表示的是俄羅斯方塊中的L方塊。 這4行僅僅表示1個方塊!

0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0

怎么找到被卡住的位置?其實,從上到下開始枚舉,這里需要找到第一個發生重疊的時刻,它的上一個時刻就是被卡住的位置。

復制一個新畫布s,畫圖的時候會在那個位置++,因為只有零和一,然后當有個點s[a][b] == 2的時候,說明發生了重疊,這樣我們需要返回到上一次畫的位置。

這樣做的話,需要考慮一種邊界情況,就是直到最下面也沒有發生重疊,為了處理這種情況,我們在畫布的最下層加入一行 g[15][] = 1,這樣就可以處理這種情況了。

ac代碼

#include<bits/stdc++.h> using namespace std; const int N = 20; int n, m;int g[N][N], s[N][N]; int p[4][4];// x,y是4*4的小方塊的左上角的坐標 bool draw(int x, int y){memcpy(s, g, sizeof g); // s是個新的畫布,用于最后輸出//將4*4的小方塊畫到新畫布里for(int i = 0; i < 4; i ++)for(int j = 0; j < 4; j ++){if(p[i][j]){int a = x + i, b = y + j; // a,b的坐標是左上角+偏移量 s[a][b] ++; if(s[a][b] ==2) return true;}}return false; }int main(){for(int i = 0; i < 15; i ++)for(int j = 0; j < 10; j++)cin >>g[i][j];// 最下面一行補上一層地板 for(int i = 0; i < 10; i ++) g[15][i] = 1; // 讀入4*4的小方格for(int i = 0; i < 4 ; i ++)for(int j = 0; j < 4; j ++)cin >> p[i][j];int c;cin >> c;c--; // 讀入的時候下標從1開始,變成下標從0開始for(int i = 0; ; i ++){if(draw(i, c)){ //新來的4*4的左上角的下標:i行,j列draw(i -1, c);break;}}for(int i = 0; i < 15; i ++){for(int j = 0; j < 10; j ++)cout << s[i][j]<<" ";cout << endl;} }

題目鏈接

https://www.acwing.com/problem/content/3231/

總結

以上是生活随笔為你收集整理的CSP认证201604-2俄罗斯方块[C++题解]:模拟、枚举的全部內容,希望文章能夠幫你解決所遇到的問題。

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