2011年8月21日日曜日

たまには画像処理

久しぶりの更新です。
いろんな事情により画像処理の練習をしようと思ってSIFTを組んでみたのですが、
プログラムにマッチングさせるまでもなくいろいろとおかしいです。
いろいろと調べて間違ってるところを直さないと・・・





2011年7月22日金曜日

Kinect.Toolkit にジェスチャのテンプレートを追加する

Eternal CodingCode PlexでKinectでジェスチャの認識をするためのライブラリが公開されてます。

記事を読むのが一番早いと思いますが、ライブラリでは点の軌跡をそのまま解析する方法と、テンプレートを予め用意しておいてそれと比較する二種類の方法があるようです。

今回はそのテンプレートを自作してみようと思います。
どういうことかというと、公開されているサンプルの

この部分に表示されるものを自分で作ってみます。
(circleKB.saveに当たるものを作る。)

自作するジェスチャは次のような感じ。


今回はこのジェスチャの軌跡をテキストファイルに手打ちして、それを読み込んで.saveファイルを作成してみました。
大体の手順はTemplateGestureDetectorのAddメソッドに座標を追加していって、それをSaveStateメソッドでファイルに保存します。
以下が正確ではないですがコードにしたものです。
  1. TemplateGestureDetector gd = new TemplateGestureDetector(null);  
  2. gd.StartRecordTemplate()  
  3. for (i = 0 ; i < n ; i++) {  
  4.     gd.add(position , kinect.SkeletonEngine);  
  5. }  
  6. gd.EndRecordTemplate()  
  7. gd.SaveState(stream)  


作成した結果がこちら


公開されているサンプルはほとんどいじっていないので、自作したテンプレートの認識結果を載せようとすると自分が写ってしまうので載せませんが、このとおりの動きをしたらきちんとジェスチャが認識されました。
最初に予定していたのに比べると傾いてしまいましたが、これは説明文をもっときちんと読むことで解消できるかと思います。

プロジェクトはこちらDownLoad

2011年7月9日土曜日

Kinect + OpenCVSharp フィルタ処理

Kinectから取ってきた深度画像とOpenCVを組み合わせて何かできないかと考えてます。
一応Kinectから取ってこれる画像は生の実画像に近いと思うのでOpenCVSharpに慣れるのもかねてフィルタ処理をしてみました。

画像中左上がKinectから取得してそのままの画像。
右上がガウシアンフィルタ。左下がブラー処理、右下がメディアンフィルタです。
これを見る限りだとフィルタ処理しても全然変わらないですね・・・
それでも若干ですがメディアンフィルタがエッジを保ちつつノイズを除去できているようには感じます。
そもそもフィルタ処理が必要かどうかという部分もありますが、使うならメディアンフィルタになるのかな・・・?

2011年7月2日土曜日

Kinect SDK + ARっぽいもの

前に、カメラからの距離の変化を利用してARっぽいことができないかと考えたので、その第一段階のようなものです。

Kinectから得られた最初のDepthFrameを基準とし、それと比べて距離が一定以上遠くなった領域の大体の重心に球体を描画しています。
もうちょっとちゃんと位置合わせしたりしないといけないですね。
まだまだ付け足さないといけない部分も多いですがこれをもとにいろいろいじろうと思います。

2011年6月26日日曜日

KinectSDK + Formアプリケーション ちょっとお遊び

現在本当は全身マウスっぽいものをやろうとしているのですが、XNA特有の問題を知らなかったりして時間を食って、現在Formアプリで作ってます。
大体は出来上がったのですが、精度面がまだかなり粗いのでその辺を改善したいと思ってます。
そんな中適当にやってたら残像?っぽいものが出てきて楽しかったので載せておきます。
適当にα値いじるだけですね。
画像は僕の腕ですw



  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using Microsoft.Research.Kinect.Nui;  
  10.   
  11. namespace Kinect_Residualimage  
  12. {  
  13.     public partial class Form1 : Form  
  14.     {  
  15.         //画面表示用  
  16.         Bitmap Texture;  
  17.   
  18.         //Kinectの変数  
  19.         Runtime nui;  
  20.   
  21.         const int ALPHA_IDX = 3;  
  22.         const int RED_IDX = 0;  
  23.         const int GREEN_IDX = 1;  
  24.         const int BLUE_IDX = 2;  
  25.         byte[] colorFrame32 = new byte[640 * 480 * 4];  
  26.   
  27.         Graphics Graphi;  
  28.   
  29.         public Form1()  
  30.         {  
  31.             InitializeComponent();  
  32.         }  
  33.   
  34.         private void Form1_Load(object sender, EventArgs e)  
  35.         {  
  36.             Texture = new Bitmap(640, 480, System.Drawing.Imaging.PixelFormat.Format32bppArgb);  
  37.   
  38.             //Kinectの初期化  
  39.             nui = new Runtime();  
  40.             try  
  41.             {  
  42.                 nui.Initialize(RuntimeOptions.UseColor);  
  43.             }  
  44.             catch (InvalidOperationException)  
  45.             {  
  46.                 Console.WriteLine("Runtime initialization failed. Please make sure Kinect device is plugged in.");  
  47.                 return;  
  48.             }  
  49.   
  50.             //video streamのOpenをする  
  51.             try  
  52.             {  
  53.                 nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);  
  54.             }  
  55.             catch (InvalidOperationException)  
  56.             {  
  57.                 Console.WriteLine("Failed to open stream. Please make sure to specify a supported image type and resolution.");  
  58.                 return;  
  59.             }  
  60.             nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_VideoFrameReady);  
  61.   
  62.             pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);  
  63.             Graphi = Graphics.FromImage(pictureBox1.Image);  
  64.         }  
  65.   
  66.         void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)  
  67.         {  
  68.             PlanarImage Image = e.ImageFrame.Image;  
  69.             byte[] converted = convertColorFrame(Image.Bits, (byte)50);  
  70.             //画像の作成  
  71.               
  72.             unsafe {  
  73.                 fixed (byte* ptr = &converted[0]) {  
  74.                     Texture = new Bitmap(Image.Width , Image.Height , Image.Width * 4 , System.Drawing.Imaging.PixelFormat.Format32bppArgb , (IntPtr)ptr);  
  75.                 }  
  76.             }  
  77.   
  78.             Graphi.DrawImage(Texture, 0, 0);  
  79.   
  80.             pictureBox1.Refresh();  
  81.         }  
  82.   
  83.         //kinectから取り込んだColorFrameのフォーマットを直す  
  84.         byte[] convertColorFrame(byte[] colorFrame , byte alpha)  
  85.         {  
  86.             for (int i = 0; i < colorFrame32.Length; i += 4)  
  87.             {  
  88.                 colorFrame32[i + ALPHA_IDX] = alpha;  
  89.                 colorFrame32[i + RED_IDX] = colorFrame[i + 0];  
  90.                 colorFrame32[i + GREEN_IDX] = colorFrame[i + 1];  
  91.                 colorFrame32[i + BLUE_IDX] = colorFrame[i + 2];  
  92.             }  
  93.             return colorFrame32;  
  94.         }  
  95.   
  96.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  97.         {  
  98.             nui.Uninitialize();  
  99.             Environment.Exit(0);  
  100.         }  
  101.     }  
  102. }  

2011年6月21日火曜日

Kinect SDK + XNA Jointを3次元座標で表示する


今までは2次元内での描画だったので今度は3次元座標を使って描画してみました。
もともと取得してこられるデータは3次元座標なので、XNAから使う分には3次元の方が楽でした。
ちゃんと3次元座標がとれたところで、マウスポインタを手で動かせるようにしてみようかと思います。そのうち。
今回のプロジェクトファイルですダウンロード

2011年6月20日月曜日

Kinect SDK + XNA スケルトンの表示

やっとKinectから取得してきたデータでスケルトンを描画できました。
早くXNAでもAPIとして2次元の直線とか基本的な図形をサポートしてもらいたいです。
さすがにソースコードは長いのでプロジェクトファイルを置いておきます。
ダウンロード

2011年6月17日金曜日

Kinectからの画像をXNAで表示する

公開されたばかりのKinectSDKのドキュメントを読みながらDirectXもWPFも使いたくない!
と思ったのでXNAでKinectから取り込んだ画像を表示できるようにしてみました。
ピクセルフォーマットとか直すところでつまづいたけど、VideoStreamとDepthStreamから得られる画像はきちんと表示できるようになりました。

土日のうちにボーンの描画までして何か作りたいですね。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Windows;  
  5. using Microsoft.Xna.Framework;  
  6. using Microsoft.Xna.Framework.Audio;  
  7. using Microsoft.Xna.Framework.Content;  
  8. using Microsoft.Xna.Framework.GamerServices;  
  9. using Microsoft.Xna.Framework.Graphics;  
  10. using Microsoft.Xna.Framework.Input;  
  11. using Microsoft.Xna.Framework.Media;  
  12. using Microsoft.Research.Kinect.Nui;  
  13.   
  14. namespace XNAFirst  
  15. {  
  16.     /// <summary>  
  17.     /// This is the main type for your game  
  18.     /// </summary>  
  19.     public class Game1 : Microsoft.Xna.Framework.Game  
  20.     {  
  21.         GraphicsDeviceManager graphics;  
  22.         SpriteBatch spriteBatch;  
  23.   
  24.         //Kinectの変数  
  25.         Runtime nui;  
  26.         int totalFrames = 0;  
  27.         int lastFrames = 0;  
  28.         DateTime lastTime = DateTime.MaxValue;  
  29.   
  30.         //テクスチャ  
  31.         private Texture2D texDepth = null;  
  32.         private Texture2D texBorn = null;  
  33.         private Texture2D texImage = null;  
  34.   
  35.         const int ALPHA_IDX = 3;  
  36.         const int RED_IDX = 0;  
  37.         const int GREEN_IDX = 1;  
  38.         const int BLUE_IDX = 2;  
  39.   
  40.         byte[] depthFrame32 = new byte[320 * 240 * 4];  
  41.         byte[] colorFrame32 = new byte[640 * 480 * 4];  
  42.   
  43.         public Game1()  
  44.         {  
  45.             graphics = new GraphicsDeviceManager(this);  
  46.             Content.RootDirectory = "Content";  
  47.             graphics.PreferredBackBufferWidth = 640;  
  48.             graphics.PreferredBackBufferHeight = 480;  
  49.         }  
  50.   
  51.         protected override void Initialize()  
  52.         {  
  53.             //kinectの初期化  
  54.             nui = new Runtime();  
  55.             try {  
  56.                 nui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);  
  57.             } catch (InvalidOperationException) {  
  58.                 System.Windows.MessageBox.Show("Runtime initialization failed. Please make sure Kinect device is plugged in.");  
  59.                 return;  
  60.             }  
  61.             //video stream と depth stream のOpenをする  
  62.             try {  
  63.                 nui.VideoStream.Open(ImageStreamType.Video , 2 , ImageResolution.Resolution640x480 , ImageType.Color);  
  64.                 nui.DepthStream.Open(ImageStreamType.Depth , 2 , ImageResolution.Resolution320x240 , ImageType.DepthAndPlayerIndex);  
  65.             } catch (InvalidOperationException) {  
  66.                 System.Windows.MessageBox.Show("Failed to open stream. Please make sure to specify a supported image type and resolution.");  
  67.                 return;  
  68.             }  
  69.             //FPS制御のための時間取得  
  70.             lastTime = DateTime.Now;  
  71.   
  72.             //イベント駆動以外でframeを取得したいのでここはちょっと保留  
  73.             nui.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_DepthFrameReady);  
  74.             nui.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);  
  75.             nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_VideoFrameReady);  
  76.             base.Initialize();  
  77.         }  
  78.   
  79.         void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)  
  80.         {  
  81.             //32bit per pixel RGBA image  
  82.             PlanarImage Image = e.ImageFrame.Image;  
  83.             texImage = new Texture2D(this.GraphicsDevice, Image.Width, Image.Height , false , SurfaceFormat.Color);  
  84.             byte[] converted = convertColorFrame(Image.Bits);  
  85.             texImage.SetData(converted);  
  86.         }  
  87.   
  88.         void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)  
  89.         {  
  90.             //とりあえず保留  
  91.         }  
  92.   
  93.         void nui_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)  
  94.         {  
  95.             PlanarImage Image = e.ImageFrame.Image;  
  96.             texDepth = new Texture2D(this.GraphicsDevice, Image.Width, Image.Height , false , SurfaceFormat.Color);  
  97.             //byteデータで取得  
  98.             //depthバッファを見やすくする  
  99.             byte[] convertedDepthFrame = convertDepthFrame(Image.Bits);  
  100.               
  101.             //byteデータから画像orスプライトを作成する  
  102.             texDepth.SetData(convertedDepthFrame);  
  103.   
  104.             totalFrames++;  
  105.   
  106.             //fps測定  
  107.             DateTime cur = DateTime.Now;  
  108.             if (cur.Subtract(lastTime) > TimeSpan.FromSeconds(1)) {  
  109.                 int frameDiff = totalFrames - lastFrames;  
  110.                 lastFrames = totalFrames;  
  111.                 lastTime = cur;  
  112.             }  
  113.         }  
  114.   
  115.         protected override void LoadContent()  
  116.         {  
  117.             // Create a new SpriteBatch, which can be used to draw textures.  
  118.             spriteBatch = new SpriteBatch(GraphicsDevice);  
  119.   
  120.             // TODO: use this.Content to load your game content here  
  121.         }  
  122.   
  123.         protected override void UnloadContent()  
  124.         {  
  125.             nui.Uninitialize();  
  126.         }  
  127.   
  128.         protected override void Update(GameTime gameTime)  
  129.         {  
  130.             // Allows the game to exit  
  131.             if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)  
  132.                 this.Exit();  
  133.   
  134.             // TODO: Add your update logic here  
  135.   
  136.             base.Update(gameTime);  
  137.         }  
  138.   
  139.         protected override void Draw(GameTime gameTime)  
  140.         {  
  141.             GraphicsDevice.Clear(Color.White);  
  142.   
  143.             this.spriteBatch.Begin();  
  144.   
  145.             this.spriteBatch.Draw(texImage, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.White);  
  146.             //this.spriteBatch.Draw(texDepth, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.White);  
  147.   
  148.             this.spriteBatch.End();  
  149.   
  150.             base.Draw(gameTime);  
  151.         }  
  152.   
  153.         //kinectから取り込んだColorFrameをXNAのColorフォーマットに直す  
  154.         byte[] convertColorFrame(byte[] colorFrame)  
  155.         {  
  156.             for (int i = 0 ; i < colorFrame32.Length ; i += 4) {  
  157.                 colorFrame32[i + ALPHA_IDX] = 255;  
  158.                 colorFrame32[i + RED_IDX] = colorFrame[i + 2];  
  159.                 colorFrame32[i + GREEN_IDX] = colorFrame[i + 1];  
  160.                 colorFrame32[i + BLUE_IDX] = colorFrame[i];  
  161.             }  
  162.             return colorFrame32;  
  163.         }  
  164.   
  165.         // Converts a 16-bit grayscale depth frame which includes player indexes into a 32-bit frame  
  166.         // that displays different players in different colors  
  167.         //XNAのテクスチャーではColorフォーマットを使うことを想定している  
  168.         byte[] convertDepthFrame(byte[] depthFrame16)  
  169.         {  
  170.             for (int i16 = 0, i32 = 0; i16 < depthFrame16.Length && i32 < depthFrame32.Length; i16 += 2, i32 += 4)  
  171.             {  
  172.                 int player = depthFrame16[i16] & 0x07;  
  173.                 int realDepth = (depthFrame16[i16 + 1] << 5) | (depthFrame16[i16] >> 3);  
  174.                 // transform 13-bit depth information into an 8-bit intensity appropriate  
  175.                 // for display (we disregard information in most significant bit)  
  176.                 byte intensity = (byte)(255 - (255 * realDepth / 0x0fff));  
  177.   
  178.                 depthFrame32[i32 + ALPHA_IDX] = 255;  
  179.                 depthFrame32[i32 + RED_IDX] = 0;  
  180.                 depthFrame32[i32 + GREEN_IDX] = 0;  
  181.                 depthFrame32[i32 + BLUE_IDX] = 0;  
  182.   
  183.                 // choose different display colors based on player  
  184.                 switch (player)  
  185.                 {  
  186.                     case 0:  
  187.                         depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);  
  188.                         depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);  
  189.                         depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 2);  
  190.                         break;  
  191.                     case 1:  
  192.                         depthFrame32[i32 + RED_IDX] = intensity;  
  193.                         break;  
  194.                     case 2:  
  195.                         depthFrame32[i32 + GREEN_IDX] = intensity;  
  196.                         break;  
  197.                     case 3:  
  198.                         depthFrame32[i32 + RED_IDX] = (byte)(intensity / 4);  
  199.                         depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);  
  200.                         depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);  
  201.                         break;  
  202.                     case 4:  
  203.                         depthFrame32[i32 + RED_IDX] = (byte)(intensity);  
  204.                         depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);  
  205.                         depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 4);  
  206.                         break;  
  207.                     case 5:  
  208.                         depthFrame32[i32 + RED_IDX] = (byte)(intensity);  
  209.                         depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 4);  
  210.                         depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);  
  211.                         break;  
  212.                     case 6:  
  213.                         depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);  
  214.                         depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);  
  215.                         depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);  
  216.                         break;  
  217.                     case 7:  
  218.                         depthFrame32[i32 + RED_IDX] = (byte)(255 - intensity);  
  219.                         depthFrame32[i32 + GREEN_IDX] = (byte)(255 - intensity);  
  220.                         depthFrame32[i32 + BLUE_IDX] = (byte)(255 - intensity);  
  221.                         break;  
  222.                 }  
  223.             }  
  224.             return depthFrame32;  
  225.         }  
  226.     }  
  227. }  

2011年6月14日火曜日

AOJ 1136

いろいろあって何故か長時間解けなかったのが解けたので。
問題文は日本語なので説明は無し。
元となる図形の始点と終点を原点に移動した物をそれぞれ用意。
その後比較するデータと回転させて4パターンの比較を行う。

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <map>  
  4. #include <set>  
  5. #include <string.h>  
  6.   
  7. using namespace std;  
  8.   
  9. struct xy {  
  10.     int first;  
  11.     int second;  
  12. };  
  13.   
  14. xy presets1[1000];  
  15. xy input[1000];  
  16.   
  17. int main(void)  
  18. {  
  19.     int n;  
  20.     while (1) {  
  21.         cin >> n;  
  22.         if (n == 0) {  
  23.             break;  
  24.         }  
  25.           
  26.         memset(presets1 , 0 , sizeof(presets1));  
  27.         memset(input , 0 , sizeof(input));  
  28.         int m;  
  29.         cin >> m;  
  30.         for (int i = 0 ; i < m ; i++) {  
  31.             cin >> presets1[i].first >> presets1[i].second;  
  32.         }  
  33.   
  34.         for (int i = 0 ; i < n ; i++) {  
  35.             int check;  
  36.             cin >> check;  
  37.             for (int j = 0 ; j < check ; j++) {  
  38.                 cin >> input[j].first >> input[j].second;  
  39.             }  
  40.             if (m != check) {  
  41.                 continue;  
  42.             }  
  43.             for (int k = 0 ; k < 4 ; k++) {  
  44.                 int ix0 = input[0].first;  
  45.                 int iy0 = input[0].second;  
  46.                 int px0 = presets1[0].first;  
  47.                 int py0 = presets1[0].second;  
  48.                 for (int j = 0 ; j < check ; j++) {  
  49.                     if (presets1[j].first - px0 != input[j].first - ix0 || presets1[j].second - py0 != input[j].second - iy0) {  
  50.                         goto NEXT;  
  51.                     }  
  52.                 }  
  53.                 cout << i + 1 << endl;  
  54.                 goto END;  
  55.     NEXT:;  
  56.                 px0 = presets1[check - 1].first;  
  57.                 py0 = presets1[check - 1].second;  
  58.                 for (int j = 0 ; j < check ; j++) {  
  59.                     if (presets1[check - j - 1].first - px0 != input[j].first - ix0 || presets1[check - j - 1].second - py0 != input[j].second - iy0) {  
  60.                         goto NEXT2;  
  61.                     }  
  62.                 }  
  63.                 cout << i + 1 << endl;  
  64.                 goto END;  
  65. NEXT2:;  
  66.                 //回転作業  
  67.                 for (int j = 0 ; j < check ; j++) {  
  68.                     int temp = input[j].first;  
  69.                     input[j].first = input[j].second;  
  70.                     input[j].second = -temp;  
  71.                 }  
  72.             }  
  73. END:;  
  74.         }  
  75.         cout << "+++++" << endl;  
  76.     }  
  77.         return 0;  
  78. }  

2011年5月27日金曜日

セルオートマトン:雪の結晶

セルオートマトンの続き。
はじめに参考文献。
セルオートマトンを用いた雪の結晶の類似パターン生成
これに書いてあるのを実装して見ました。

適当にパターンいじってみたらこんな感じに。
やっぱりセルオートマトン楽しいな。
動物の模様とかもシミュレートできるようなのでそれも実装したいです。









2011年5月17日火曜日

AOJ 2205

国内予選までは解ける問題を一日2問解くようにしたい。

AOJ 2205。 難易度はB問。
宝くじでいくら当たってるかを解析する。
一枚のくじに対して複数のあたりが存在しないってことなので普通に書いたら終わり。

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <map>  
  4. #include <string>  
  5.   
  6. using namespace std;  
  7.   
  8. vector<pair<string , int> > treasure;  
  9.   
  10. int main(void)  
  11. {  
  12.  while (1) {  
  13.      int n , m;  
  14.      cin >> n >> m;  
  15.      if (n == 0 && m == 0) {  
  16.          break;  
  17.      }  
  18.      treasure.clear();  
  19.      for (int i = 0 ; i < n ; i++) {  
  20.          pair<string , int> temp;  
  21.          cin >> temp.first >> temp.second;  
  22.          treasure.push_back(temp);  
  23.      }  
  24.    
  25.      int result = 0;  
  26.      string have;  
  27.      for (int i = 0 ; i < m ; i++) {  
  28.          cin >> have;  
  29.          for (int j = 0 ; j < n ; j++) {  
  30.              for (int k = 0 ; k < treasure[j].first.size() ; k++) {  
  31.                  if (treasure[j].first[k] == '*') {  
  32.                      continue;  
  33.                  }  
  34.                  if (treasure[j].first[k] != have[k]) {  
  35.                      goto NEXT;  
  36.                  }  
  37.              }  
  38.              result += treasure[j].second;  
  39.              break;  
  40. NEXT:;  
  41.          }  
  42.      }  
  43.      cout << result << endl;  
  44.  }  
  45.  return 0;  
  46. }  

AOJ 2149

AOJ 2149の問題。A問。
スロットマシーンであたりを引くまで最低何回やればいいか、みたいな内容だった気がする。


#include
#include

using namespace std;

vector real;

int main(void)
{
int N , A , B , C , X;
while (1) {
cin >> N >> A >> B >> C >> X;
if (N == 0 && A == 0 && B == 0 && C == 0 && X == 0) {
break;
}
real.clear();
for (int i = 0 ; i < N ; i++) {
int temp;
cin >> temp;
real.push_back(temp);
}
int count = 0;
for (int i = 0 ; i < real.size() ;) {
if (X == real[i]) {
i++;
if (i == real.size()) {
break;
}
}
X = (A * X + B) % C;
count++;
if (count > 10000) {
count = -1;
break;
}
}

cout << count << endl;
}

return 0;
}

2011年5月16日月曜日

AOJ 2019

記事も少ないので解いたものを載せていこうと思います。
結構前に解いたものなのでもう問題は覚えてないけど・・・

  1. #include <iostream>  
  2. #include <map>  
  3. #include <algorithm>  
  4. #include <vector>  
  5.   
  6. using namespace std;  
  7.   
  8. vector<pair><int int=""> > data;  
  9.   
  10. int main(void)  
  11. {  
  12.    int n , m;  
  13.    while (1) {  
  14.        cin >> n >> m;  
  15.        if (n == 0 && m == 0) {  
  16.            break;  
  17.        }  
  18.        
  19.        int maxd = 0;  
  20.        data.clear();  
  21.        pair<int int=""> temp;  
  22.        for (int i = 0 ; i < n ; i++) {  
  23.            cin >> temp.second >> temp.first;  
  24.            maxd += temp.first * temp.second;  
  25.            data.push_back(temp);  
  26.        }  
  27.        sort(data.begin() , data.end());  
  28.        vector<pair><int int=""> >::reverse_iterator begin = data.rbegin();  
  29.        vector<pair><int int=""> >::reverse_iterator end = data.rend();  
  30.        for (; begin != end ; begin++) {  
  31.            int length = min(begin->second , m);  
  32.            maxd -= (length * begin->first);  
  33.            m -= length;  
  34.            if (m <= 0) {  
  35.                break;  
  36.            }  
  37.        }  
  38.   
  39.        maxd = max(0 , maxd);  
  40.        cout << maxd << endl;  
  41.    }  
  42.    return 0;  
  43. }  
  44.   
  45.   
  46. </int></pair></int></pair></int></int></pair></vector></algorithm></map></iostream>  

2011年5月1日日曜日

2次元セルオートマトン



引越し記事3つ目。

セルオートマトンのルールのうちいくつかをまとめたものを作りました。
Generationsルールとか面白いので大好きです。
ダウンロード

ラングトンの蟻



お引越し記事第二弾。

昔作ったラングトンの蟻です。
特に凝ったこともせずそのまま。
簡単なルールなのに規則的な動きが出てくるとやっぱり面白いですね。

動かない場合は、GLUTやらGLFWあたりを導入してもらえると大丈夫かと思います。
ダウンロード

2011年4月30日土曜日

1次元セルオートマトン



1次元セルオートマトンです。
GLUT、GLFW、AntTweakBarを使用しています。
使い方ですが、「000(1)」とか書いてある横で1になっている部分の括弧内の数字を足したものがルールxに相当します。
left以下の欄は初期状態で左端、真ん中、右端を1にするかどうかの設定です。

自己責任でお願いします。
ダウンロード

引越し、セッティング中

旧ブログから、作った物だけをお引越しさせています。
これから先につくるものもここで公開していきたいと思います。